Формирование трех подпроцессов дает странный случайный вывод - PullRequest
0 голосов
/ 23 октября 2011

Я пытаюсь создать три процесса для передачи друг другу.Однако я действительно озадачен разветвлением третьего процесса.Форкирование и обвязка только двумя процессами работает без проблем.Когда я добавляю +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, программа завершается нормально.Может кто-нибудь объяснить, что происходит?

1 Ответ

3 голосов
/ 23 октября 2011

открыт (0); * * тысяча два

открыт (1); * +1004 *

Пожалуйста, прочитайте справочную страницу , чтобы открыть (2).

Подсказка: не требуется один параметр. Вероятно, вам следует собрать с -Wall и обратить внимание на предупреждения компилятора.

Это, вероятно, не полностью объясняет то, что вы видите, но, учитывая эту очевидную ошибку, мне лень смотреть дальше.

...