Читать «UNIX: взаимодействие процессов» онлайн - страница 39
Уильям Ричард Стивенс
При запуске этой программы в Solaris 2.6, в которой организована поддержка двусторонних каналов, мы получим ожидаемый результат:
solaris % fduplex
child read p
parent read с
Символ р передается по одному из двух односторонних каналов, изображенных на рис. 4.10, а именно по верхнему каналу. Символ с передается по нижнему одностороннему каналу. Родительский процесс не считывает обратно записанный им в канал символ р (что и требуется).
При запуске этой программы в Digital Unix 4.0B, в которой по умолчанию создаются односторонние каналы (двусторонние каналы — как в SVR4 — будут создаваться в том случае, если при компиляции указать специальные параметры), мы увидим результат, ожидаемый для одностороннего канала:
alpha % fduplex
read error: Bad file number
alpha % child read p
write error: Bad file number
Родительский процесс записывает символ р, который успешно считывается дочерним процессом, однако при попытке считывания из канала (дескриптор fd[l]) родительский процесс прерывается с ошибкой, как и дочерний процесс, при попытке записи в канал (дескриптор fd[0]). Вспомните рис. 4.8. Функция read возвращает код ошибки EBADF, означающий, что дескриптор не открыт для чтения. Аналогично write возвращает тот же код ошибки, если дескриптор не был открыт на запись.
4.5. Функции popen и pclose
Другим примером использования каналов является имеющаяся в стандартной библиотеке ввода-вывода функция popen, которая создает канал и запускает другой процесс, записывающий данные в этот канал или считывающий их из него:
#include <stdio.h>
FILE *popen(const char *
/* Возвращает указатель FILE * в случае успешного выполнения, NULL – в случае ошибки */
int pclose(FILE *s
/* Возвращает код завершения команды интерпретатора или –1 – в случае ошибки */
Аргумент
■ если
■ если
Функция pclose закрывает стандартный поток ввода-вывода stream, созданный командой popen, ждет завершения работы программы и возвращает код завершения, принимаемый от интерпретатора.
ПРИМЕЧАНИЕ
Информацию о реализациях popen и pclose можно найти в разделе 14.3 [21].