Итак, я пишу программу, которая включает в себя создание 2 наборов каналов, чтобы родительский процесс мог писать в дочерний процесс & дочерний процесс может вернуться назад …
У меня есть следующий код для моего дочернего процесса:
if(pid==0){ //child process
cout << "executing child" << endl;
close(fd1[WRITE_END]);
close(fd2[READ_END]);
if(dup2(fd1[READ_END],STDIN_FILENO) < 0 || dup2(fd2[WRITE_END],STDOUT_FILENO) < 0){
cerr << "dup2 failed" << endl;
exit(1);
}
cout << "test output" << endl;
close(fd2[WRITE_END]);
close(fd1[READ_END]);
read(fd1[READ_END],buf,BUFFER_SIZE);
cout << "Child process read " << buf << endl;
execl("/bin/sort", "sort", "-nr", NULL);} else { //... parent process
Когда я запускаю свою программу, все, что я получаю в качестве вывода от дочернего процесса, это executing child
но нет test output
,
Однако когда я удаляю оператор if, обрабатывающий вызовы dup2, мой вывод включает test output
,
Любые идеи относительно того, почему dup2 заставляет мой дочерний процесс не заканчиваться?
(и, между прочим, первоначально мои два dup2 были сделаны в отдельных операторах if … когда я помещал результаты теста ниже dup2(fd1[READ_END],STDIN_FILENO) < 0
test, он выводит, но не тогда, когда я ставлю его ниже другого условного теста dup2, поэтому я убежден, что именно в этом моя проблема)
заранее спасибо
Вызов dup2 (fd2 [WRITE_END], STDOUT_FILENO) подключает STDOUT (который используется потоком C ++ Cout) к вашему каналу fd2. Таким образом, «тестовый вывод» записывается в канал.
Других решений пока нет …