Руководство программиста для Linux


Ядро LINUX


if((childpid = fork()) == -1) { perror("fork"); exit(1); } if(childpid == 0) { /* Потомок закрывает вход */ close(fd[0]); } else { /* Родитель закрывает выход */ close(fd[1]); } . . }

Как было упомянуто ранее, раз канал был установлен, то файловые дескрипторы могут обрабатываться подобно дескрипторам нормальных файлов. /************************************************************************* Excerpt from "Linux Programmer's Guide - Chapter 6" (C)opyright 1994-1995, Scott Burkett ************************************************************************* MODULE: pipe.c *************************************************************************/ #include #include #include int main(void) { int fd[2], nbytes; pid_t childpid; char string[] = "Hello, world!\n"; char readbuffer[80]; pipe(fd); if((childpid = fork()) == -1) { perror("fork"); exit(1); } if(childpid == 0) { /* Потомок закрывает вход */ close(fd[0]); /* Посылаем "string" через выход канала */ write(fd[1], string, strlen(string)); exit(0); } else { /* Родитель закрывает выход */ close(fd[1]); /* Чтение строки из канала */ nbytes = read(fd[0], readbuffer, sizeof(readbuffer)); printf("Received string: %s", readbuffer); } return(0); }

Часто дескрипторы потомка раздваиваются на стандартный ввод или вывод. Потомок может затем exec() другую программу, которая наследует стандартные потоки. Давайте посмотрим на системный вызов dup(): SYSTEM CALL: dup(); PROTOTYPE: int dup( int oldfd ); RETURNS: new descriptor on success -1 on error: errno = EBADF (oldfd некорректен) EBADF ($newfd is out of range$) EMFILE (слишком много дескрипторов для процесса)

NOTES: старый дескриптор не закрыт! Оба работают совместно!

Несмотря на то, что старый и новосозданный дескрипторы взаимозаменяемы, мы будем сначала закрывать один из стандартных потоков. Системный вызов dup() использует наименьший по номеру неиспользуемый дескриптор для нового.

Рассмотрим: . . childpid = fork(); if(childpid == 0) { /* Закрываем стандартный ввод потомка */ close(0); /* Дублируем вход канала на stdin */ dup(fd[0]); execlp("sort", "sort", NULL); . }




Начало  Назад  Вперед