Я разрабатываю приложение командной строки для перехвата вызова инструментов CLI, таких как ls или cat. Мне нужно проверить и проанализировать переданное им исходное содержимое стандартного ввода. Однако мне было довольно сложно добиться следующего:
Родительский процесс может читать со стандартного ввода только тогда, когда дочерний процесс пытается прочитать со стандартного ввода.
Следующий код не будет работать:
int pipe[2];
// ...
char buf[1024];
int n;
while ((n = fread(stdin, buf, sizeof(buf)) != -1)
write(pipe[1], buf, n);
поскольку родительский элемент не завершается, когда дочерний элемент завершает работу без чтения со стандартного ввода.
Когда родительский элемент читает EOF из стандартного ввода, он также пересылает EOF дочернему элементу.
Итак, как записать EOF в стандартный ввод дочернего элемента?
Я разрабатываю приложение командной строки для перехвата вызова инструментов CLI, таких как ls или cat. Мне нужно проверить и проанализировать переданное им исходное содержимое стандартного ввода. Однако мне было довольно сложно добиться следующего: [list] [*]Родительский процесс может читать со стандартного ввода только тогда, когда дочерний процесс пытается прочитать со стандартного ввода. Следующий код не будет работать: [code]int pipe[2]; // ... char buf[1024]; int n; while ((n = fread(stdin, buf, sizeof(buf)) != -1) write(pipe[1], buf, n); [/code] поскольку родительский элемент не завершается, когда дочерний элемент завершает работу без чтения со стандартного ввода.
[*]Когда родительский элемент читает EOF из стандартного ввода, он также пересылает EOF дочернему элементу. Итак, как записать EOF в стандартный ввод дочернего элемента?
[/list] Вот код моей последней версии: [code] auto pid = fork(); if (pid == -1) { std::cerr