Системное программирование в UNIX средствами Free Pascal


Каналы и системный вызов ехес


Вспомним, как можно создать канал между двумя программами с помощью командного интерпретатора:

$ ls | wc

Как это происходит? Ответ состоит из двух частей. Во-первых, командный интерпретатор использует тот факт, что открытые дескрипторы файлов остаются открытыми (по умолчанию) после вызова ехес. Это означает, что два файловых дескриптора канала, которые были открыты до выполнения комбинации вызовов fork/ехес, останутся открытыми и когда дочерний процесс начнет выполнение новой программы. Во-вторых, перед вызовом ехес командный интерпретатор соединяет стандартный вывод программы ls

с входом канала, а стандартный ввод программы wc – с выходом канала. Это можно сделать при помощи вызова fcntl или dup2, как было показано в упражнении 5.10. Так как значения дескрипторов файлов, соответствующих стандартному вводу, стандартному выводу и стандартному выводу диагностики, равны 0, 1 и 2 соответственно, то можно, например, соединить стандартный вывод с другим дескриптором файла, используя вызов dup2 следующим образом. Обратите внимание, что перед переназначением вызов dup2 закрывает файл, представленный его вторым параметром.

(* Вызов dup2 будет копировать дескриптор файла 1 *)

dup2(filedes, 1);

.

.

.

(* Теперь программа будет записывать свой стандартный *)

(* вывод в файл, заданный дескриптором filedes *)

.

.

.

Следующий пример, программа join, демонстрирует механизм каналов, задействованный в упрощенном командном интерпретаторе. Программа join имеет два параметра, com1 и com2, каждый из которых соответствует выполняемой команде. Оба параметра в действительности являются массивами строк, которые будут переданы вызову execvp.

 

 

 

Родительский процесс

 

 

 

 

 

 

 

 

 

wait()

 

 

 

 

 

 

 

 

 

Потомок дочернего процесса

(com1)

 

 

 

Дочерний процесс

(com2)

 

 

 

 

 

 

 

 

> > fdin

fdread()

 

 

^

 

(stdin)

fdwrite()

fdout > >

 

 

 

(stdout)

 

 

 

 

<


- Начало -  - Назад -  - Вперед -



Книжный магазин