.TH MPU_POPEN 3 "Август 2026" "libmpuio" "Руководство программиста LIBMPUIO" .SH ИМЯ mpu_popen, mpu_pclose \- открыть и закрыть командный канал LIBMPUIO .SH ОБЗОР .nf #include mpu_FILE *mpu_popen( const char *command, const char *mode ); int mpu_pclose( mpu_FILE *stream ); .fi .SH ОПИСАНИЕ .B mpu_popen запускает .I command через .B /bin/sh -c и возвращает однонаправленный поток LIBMPUIO на основе дескриптора. Режим должен быть в точности .B "r" для чтения стандартного вывода команды либо .B "w" для записи в стандартный ввод команды. .PP Текстовые операции сохраняют обычную границу преобразования LIBMPUIO: внутри потока данные представлены в UCS-2, а по каналу передаются внешние байты UTF-8. Сырые операции .BR mpu_fread (3) и .BR mpu_fwrite (3) работают непосредственно с байтами канала. .PP .B mpu_pclose сбрасывает и закрывает поток, созданный .BR mpu_popen , после чего ожидает завершения процесса команды. Командный поток должен завершаться посредством mpu_pclose(), а не отсоединяться через mpu_freopen() и не закрываться обычным mpu_fclose(), поскольку именно mpu_pclose() выполняет обязательное ожидание дочернего процесса. .SH ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ .B mpu_popen при успехе возвращает указатель на поток, при ошибке \- NULL. .B mpu_pclose при успехе возвращает статус ожидания дочернего процесса, а при ошибке \- -1 с установленным .BR errno . Статус можно анализировать макросами, описанными в .BR waitpid (2). .SH ОШИБКИ .B EINVAL возвращается для NULL-команды, неподдерживаемого режима или попытки вызвать .B mpu_pclose для потока, который не был создан .BR mpu_popen . .BR mpu_freopen (3) также возвращает EINVAL, если ей передан командный поток. .SH ПРИМЕЧАНИЯ Строка команды интерпретируется оболочкой и подчиняется обычным правилам кавычек и подстановок shell. Не формируйте её из недоверенного текста без соответствующей проверки или экранирования. .PP Поддерживаются только однонаправленные режимы POSIX .B r и .BR w . Конец канала в родительском процессе создаётся с close-on-exec, поэтому ранее открытые командные потоки не наследуются последующими запускаемыми командами. .SH ПРИМЕР .nf mpu_FILE *fp = mpu_popen( "printf 'hello\\n'", "r" ); __mpu_char16_t line[32]; int status; if( fp != NULL ) { mpu_fgets( line, 32, fp ); status = mpu_pclose( fp ); } .fi .SH СМ. ТАКЖЕ .BR libmpuio (3), .BR mpu_fopen (3), .BR mpu_fclose (3), .BR mpu_fread (3), .BR mpu_fwrite (3), .BR waitpid (2)