fork() и pipe()
Есть задание по программировению на С, в UNIX системах:
Создать параллельный процесс, используя только fork.Организовать обмен информацией между процессами через каналы таким образом, чтобы родительский процесс читал из канала в цикле, пока не встретится конец файла (порожденный процесс может записывать в канал информацию, читаемую им из стандартного входного потока).
Вот текст программы:
int main(int argc, char *argv[])
{
int fd[2];
pid_t pid;
char buf;
pipe( fd );
switch( fork() ){
case -1:
perror( "fork()" );
exit( 1 );
case 0:
close(fd[0]);
while (read(0, &buf, 1) > 0) {
write(fd[1], &buf, 1);
}
write(1, "Death child\n", 12);
close(fd[1]);
break;
default:
close(fd[1]);
while (read(fd[0], &buf, 1) > 0) {
write(1, &buf, 1);
}
write(1, "Death parent\n", 12);
close(fd[0]);
wait(NULL);
break;
}
}
Я его полностью разобрал( внес правки, которые сделали код более понятным, по моему мнению). Но я не могу понять 1.Почему после каждой итерации циклов В child:
while (read(0, &buf, 1) > 0) {
write(fd[1], &buf, 1);
}
В parent:
while (read(fd[0], &buf, 1) > 0) {
write(1, &buf, 1);
}
у меня идет переход на другой процесс ( на родительский или дочерний )? 2.Как избежать бесконечного ожидания родительским процессом чтения из пустого канала?










Ответы - fork() и pipe() / fork() и pipe()

09.01.2018 09:34:59
Программа работает абсолютно нормально. Что же касается вопросов:
- У меня идет переход на другой процесс ( на родительский или дочерний )?
- Как избежать бесконечного ожидания родительским процессом чтения из пустого канала?
То они ставят в тупик... В памяти вашего компа ОДНОВРЕМЕННО присутствуют два процесса. Какой из них выполняется каким именно процессором и в какое время - это решает ядро операционки.
Если процесс не готов к выполнению (например - ждёт ввода), то он висит. Какой процесс первым придёт в готовность, тот и продолжит своё выполнение.
Вот и весь преход... С точки зрения ядра - абсолютно не важно, родительский, или дочерний.
А насчёт ввода из пустого канала - это Вы вообще - как представляете?! Если канал пуст, как из него можно что-то ввести? Вот программа и висит на операции read.