Основы программирования в 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>
Назначение вызова
dup
open
dup
dup
dup2
file_descriptor_two
Того же эффекта, что и применение вызовов
dup
dup2
fcntl
F_DUPFD
dup
fcntl
F_DUPFD
Итак, как же
dup
dup
dup
dup
Легче всего понять, что происходит, когда вы закрываете файловый дескриптор 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 bytes
0000000 1 2 3
0000003
Как это работает
Как и прежде, программа создает канал, затем выполняет вызов
fork
Давайте первым рассмотрим дочерний процесс. Он закрывает свой стандартный ввод с помощью
close(0)
dup(file_pipes[0])
read
file_pipes[0]
file_pipes[1]