1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
|
.TH MPU_POPEN 3 "Август 2026" "libmpuio" "Руководство программиста LIBMPUIO"
.SH ИМЯ
mpu_popen, mpu_pclose \- открыть и закрыть командный канал LIBMPUIO
.SH ОБЗОР
.nf
#include <libmpuio.h>
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)
|