Главная

Популярная публикация

Научная публикация

Случайная публикация

Обратная связь

ТОР 5 статей:

Методические подходы к анализу финансового состояния предприятия

Проблема периодизации русской литературы ХХ века. Краткая характеристика второй половины ХХ века

Ценовые и неценовые факторы

Характеристика шлифовальных кругов и ее маркировка

Служебные части речи. Предлог. Союз. Частицы

КАТЕГОРИИ:






Прогон программы для pipe в одном процессе




Достаточно яркой иллюстрацией действий по созданию pip′a, записи в него данных, чтению из него и освобождению выделенных ресурсов может служить программа, организующая работу с pip’ом в рамках одного процесса, приведенная ниже:

/* Программа 03-2.с, иллюстрирующая работу с pip′ом в рамках одного процесса */ #include <sys/types.h>#include <unistd.h>#include <stdio.h>int main(){int fd[2]; size_t size;char string[] = "Hello, world!";char resstring[14]; /* Попытаемся создать pipe */if(pipe(fd) < 0){/* Если создать pipe не удалось, печатаем об этом сообщение и прекращаем работу */printf("Can′t create pipe");exit(-1); }/* Пробуем записать в pipe 14 байт из нашего массива, т.е. всю строку "Hello, world!" вместе с признаком конца строки */size = write(fd[1], string, 14);if(size!= 14){/* Если записалось меньшее количество байт, сообщаем об ошибке */printf("Can′t write all string"); exit(-1); } /* Пробуем прочитать из pip′а 14 байт в другой массив, т.е. всю записаннуюстроку */size = read(fd[0], resstring, 14);if(size < 0){/* Если прочитать не смогли, сообщаем об ошибке */printf("Can′t read string"); exit(-1); } /* Печатаем прочитанную строку */printf("%s",resstring);/* Закрываем входной поток*/if(close(fd[0]) < 0){ printf("Can′t close input stream"); }/* Закрываем выходной поток*/if(close(fd[1]) < 0){ printf("Can′t close output stream"); } return 0; }

Организация связи через pipe между процессом-родителем и процессом-потомком. Наследование файловых дескрипторов при вызовах fork() и exec()

Понятно, что если бы все достоинство pip′ов сводилось к замене функции копирования из памяти в память внутри одного процесса на пересылку информации через операционную систему, то овчинка не стоила бы выделки. Однако таблица открытых файлов наследуется процессом-ребенком при порождении нового процесса системным вызовом fork() и входит в состав неизменяемой части системного контекста процесса при системном вызове exec() (за исключением тех потоков данных, для файловых дескрипторов которых был специальными средствами выставлен признак, побуждающий операционную систему закрыть их при выполнении exec(), однако их рассмотрение выходит за рамки нашего курса). Это обстоятельство позволяет организовать передачу информации через pipe между родственными процессами, имеющими общего прародителя, создавшего pipe.






Не нашли, что искали? Воспользуйтесь поиском:

vikidalka.ru - 2015-2024 год. Все права принадлежат их авторам! Нарушение авторских прав | Нарушение персональных данных