Я пытаюсь создать три процесса для передачи друг другу.Однако я действительно озадачен разветвлением третьего процесса.Форкирование и обвязка только двумя процессами работает без проблем.Когда я добавляю +1 цикл, чтобы проверить, появляется ли третий процесс, я получаю странные результаты в терминале.
Это мой код (со странными результатами):
#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
int main(){
int status, i;
int pip[2];
/* Spawn 3 subprocesses and pipe the first 2*/
for (i=0; i<3; i++){
if (i==0) pipe(pip);
if (fork()==0){
/* First subprocess */
if (i==0){
dup2(pip[1], 1); //pip[0] will replace stdout
close(pip[0]);
if (execlp("ls", "ls", NULL)) perror("process1");
}
/* Second subprocess */
if (i==1){
dup2(pip[0], 0); //pip[1] -> will replace stdin
close(pip[1]);
if (execlp("more", "more", NULL)) perror("process2");
}
/* Third subprocess */
if (i==2){
close(pip[0]); //reseting fd
close(pip[1]); //reseting fd
open(0); //reseting fd
open(1); //reseting fd
if (execlp("ls", "ls", NULL)) perror("process3");
}
}
}
wait(&status);
return 0;
}
Изменениецикл for до 2 циклов вместо 3 останавливает странное поведение.Странное поведение заключается в том, что случайно я получу один из следующих выходов в терминале:
manos@megistanas:~/Desktop/test$ ./test
test test2.c test3.c test4.c test.5c test.c
test
test2.c
test3.c
test4.c
test.5c
test.c
manos@megistanas:~/Desktop/test$
В этом случае он работал как обычно.Теперь в некоторых моментах это выглядит так:
manos@megistanas:~/Desktop/test$ test
test2.c
test3.c
test4.c
test.5c
test.c
test test2.c test3.c test4.c test.5c test.c
manos@megistanas:~/Desktop/test$ manos@megistanas:~/Desktop/test$ manos@megistanas:~/Desktop/test$ manos@megistanas:~/Desktop/test$ manos@megistanas:~/Desktop/test$
При нажатии Enter просто записывает подсказку и ждет большего ввода.Третье странное поведение таково:
manos@megistanas:~/Desktop/test$ test
test2.c
test3.c
test4.c
test.5c
test.c
(blinking prompt symbol)
Как только я нажимаю Enter, программа завершается нормально.Может кто-нибудь объяснить, что происходит?