Основы программирования в Linux
Основы программирования в Linux читать книгу онлайн
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
#include <unistd.h>#include <stdlib.h>#include <stdio.h>#include <string.h>int main() { int data_processed; int file_pipes[2]; const char somedata[] = "123"; char buffer[BUFSIZ + 1]; pid_t fork_result; memset(buffer, ' ', sizeof(buffer)); if (pipe(file_pipes) == 0) { fork_result = fork(); if (fork_result == (pid_t)-1) { fprintf(stderr, "Fork failure"); exit(EXIT_FAILURE); } if (fork_result == 0) {<i> sprintf(buffer, "%d", file_pipes[0]);</i><i> (void)execl("pipe4", "pipe4", buffer, (char*)0);</i><i> exit(EXIT_FAILURE);</i> } else { data_processed = write(file_pipes[1], some_data, strlen(some_data));<i> printf ("%d - wrote %d bytesn", getpid(), data_processed);</i> } } exit(EXIT_SUCCESS);}2. Программа-потребитель pipe4.c, читающая данные, гораздо проще:
#include <unistd.h>#include <stdlib.h>#include <stdio.h>#include <string.h>int main(int argc, char *argv[]) { int data_processed; char buffer[BUFSIZ + 1]; int file_descriptor; memset(buffer, ' ', sizeof(buffer)); sscanf(argv[1], "%d", &file_descriptor); data_processed = read(file_descriptor, buffer, BUFSIZ); printf("%d — read %d bytes: %sn", getpid(), data_processed, buffer); exit(EXIT_SUCCESS);}Выполнив pipe3 и помня о том, что она вызывает программу pipe4, вы получите вывод, аналогичный приведенному далее:
$ <b>./pipe3</b>22460 - wrote 3 bytes22461 - read 3 bytes: 123Как это работает
Программа pipe3 начинается как предыдущий пример, используя вызов
pipeforksprintfВызов
execl□ вызванная программа;
□
argv[0]□
argv[1]□
(char *)0Программа pipe4 извлекает номер файлового дескриптора из строки аргументов и затем читает из него данные.
Чтение закрытых каналов
Прежде чем двигаться дальше, необходимо более внимательно рассмотреть файловые дескрипторы, которые открыты. До этого момента вы разрешали читающему процессу просто читать какие-то данные и завершаться, полагая, что ОС Linux уберет файлы в ходе завершения процесса.
В большинстве программ, читающих данные из стандартного ввода, это делается несколько иначе, чем в виденных вами до сих пор примерах. Обычно программы не знают, сколько данных они должны считать, поэтому они, как правило, выполняют цикл — чтение данных, их обработка и затем снова чтение данных и так до тех пор, пока не останется данных для чтения.
Вызов
readreadreadЕсли вы применяете канал с вызовом
forkreadO_NONBLOCKКаналы, применяемые как стандартные ввод и вывод
Теперь, когда вы знаете, как заставить вызов
readОдно неоспоримое достоинство заключается в том, что вы можете вызывать стандартные программы, которым не нужен файловый дескриптор как параметр. Для этого вам следует применить функцию
dupdup
