Основы программирования в Linux
Основы программирования в Linux читать книгу онлайн
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
exit(EXIT_SUCCESS); } exit(EXIT_FAILURE);}Если вы выполните программу, то получите следующий вывод:
$ <b>./pipe1</b>Wrote 3 bytesRead 3 bytes: 123Как это работает
Программа создает канал с помощью двух файловых дескрипторов из массива
file_pipes[]file_pipes[1]file_pipes[0]writereadСледует знать, что реакция на попытку писать с помощью дескриптора
file_descriptor[0]file_descriptor[1]На первый взгляд этот пример использования канала ничего не предлагает такого, чего мы не могли бы сделать с помощью простого файла. Действительные преимущества каналов проявятся, когда вам нужно будет передавать данные между двумя процессами. Как вы видели в главе 11, когда программа создает новый процесс с помощью вызова
forkforkfork1. Это пример pipe2.c. Он выполняется также как первый до того момента, пока вы не вызовете функцию
fork#include <unistd.h>#include <stdlib.h>#include <stdio.h>#include <string.h>int main() { int data_processed; int file_pipes[2]; const char some_data[] = "123"; char buffer[BUFSIZ + 1]; pid_t fork_result; memset(buffer, '0', sizeof(buffer)); if (pipe(file_pipes) == 0) { fork_result = fork(); if (fork_result == -1) { fprintf(stderr, "Fork failure"); exit(EXIT_FAILURE); }2. Вы убедились, что вызов
fork if (fork_result == 0) { data_processed = read(file_pipes[0], buffer, BUFSIZ); printf("Read %d bytes: %sn", data_processed, buffer); exit(EXIT_SUCCESS); }3. В противном случае вы должны быть в родительском процессе:
else { data_processed = write(file_pipes[1], some_data, strlen(some_data)); printf("Wrote %d bytesn", data_processed); } } exit(EXIT_SUCCESS);}После выполнения этой программы вы получите вывод, аналогичный предыдущему:
$ <b>./pipe2</b>Wrote 3 bytesRead 3 bytes: 123Вы можете столкнуться с повторным выводом строки приглашения для ввода команды перед завершающим фрагментом вывода, поскольку родительский процесс завершится раньше дочернего, поэтому мы подчистили вывод, чтобы его легче было читать.
Как это работает
Сначала программа создает канал с помощью вызова
pipeforkforkwritereadНесмотря на то, что программа внешне похожа на первый пример
pipe
Рис. 13.2
Родительский и дочерний процессы
Следующий логический шаг в нашем изучении вызова
pipeexecexecfile_pipesexecexecДля того чтобы посмотреть, как это работает, вам понадобятся две программы (упражнение 13.7). Первая — поставщик данных. Она создает канал и затем вызывает дочерний процесс, потребитель данных.
exec1. Для получения первой программы исправьте pipe2.c, превратив ее в pipe3.c. Измененные строки затенены.
