Основы программирования в Linux
Основы программирования в Linux читать книгу онлайн
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
<b>#include <unistd.h></b><b>int dup(int file_descriptor);</b><b>int dup2(int file_descriptor_one, int file_descriptor_two);</b>Назначение вызова
dupopendupdupdup2file_descriptor_twoТого же эффекта, что и применение вызовов
dupdup2fcntlF_DUPFDdupfcntlF_DUPFDИтак, как же
dupdupdupdupЛегче всего понять, что происходит, когда вы закрываете файловый дескриптор 0 и затем вызываете
dupТаблица 13.1
| Номер файлового дескриптора | Первоначально | После закрытия файлового дескриптора 0 | После вызова dup |
|---|---|---|---|
| 0 | Стандартный ввод | {closed} | Файловый дескриптор канала |
| 1 | Стандартный вывод | Стандартный вывод | Стандартный вывод |
| 2 | Стандартный поток ошибок | Стандартный поток ошибок | Стандартный поток ошибок |
| 3 | Файловый дескриптор канала | Файловый дескриптор канала | Файловый дескриптор канала |
А теперь выполните упражнение 13.8.
dupДавайте вернемся к предыдущему примеру, но на этот раз вы измените дочернюю программу, заменив в ней файловый дескриптор stdin концом считывания
readПревратите программу pipe3.c в pipe5.c с помощью следующего программного кода:
#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"; pid_t fork_result; if (pipe(file_pipes) == 0) { fork_result = fork(); if (fork_result == (pid_t)-1) { fprintf(stderr, "Fork failure"); exit(EXIT_FAILURE); } if (fork_result == (pid_t)0) {<i> close(0);</i><i> dup(file_pipes[0];</i><i> close(file_pipes[0]);</i><i> close(file_pipes[1]);</i><i> execlp("od", "od", "-c", (char*)0);</i> exit(EXIT_FAILURE); } else {<i> close(file_pipes[0]);</i> data_processed = write(file_pipes[1], some_data, strlen(some_data)); close(file_pipes[1]); printf("%d — wrote %d bytesn", (int)getpid(), data_processed); } } exit(EXIT_SUCCESS);}У этой программы следующий вывод:
$ <b>./pipe5</b>22495 - wrote 3 bytes0000000 1 2 30000003Как это работает
Как и прежде, программа создает канал, затем выполняет вызов
forkДавайте первым рассмотрим дочерний процесс. Он закрывает свой стандартный ввод с помощью
close(0)dup(file_pipes[0])readfile_pipes[0]file_pipes[1]
