c pipe: программа просто останавливается перед ожиданием (NULL); - PullRequest
2 голосов
/ 02 апреля 2012

Программа может читать все данные из канала. Однако программа просто остановится. Это не может продолжать обрабатывать. Я думаю, что это остановится в дочернем процессе.

//I created two pipe before fork (fd[0] and fd[1]).
//child process
if(pid == 0){
    close(fd[a][1]);
    buf[6];
    int i;
    while ((i = read(fd[a][0], buf, 6)) > 0) {
        printf("%s", buf);     
    }
    close(fd[a][0]);
exit(0); 
}

//parent process
write(fd[a][1], "12", 2);
write(fd[a][1], "14", 2);
write(fd[a][1], "15", 2);
write(fd[b][1], "12", 2);
write(fd[b][1], "14", 2);
write(fd[b][1], "15", 2);
printf("done!\n");
close(fd[0][1]);
close(fd[1][1]);
wait(NULL);
printf("Really done!!!\n");
...                      // The program cannot run after wait(NULL);

--output--
121415done

Ответы [ 3 ]

0 голосов
/ 02 апреля 2012

Вы запускаете read в цикле while, эффективно блокируя себя, пока что-то не пойдет не так.Если вам нужно прочитать 6 символов, вы должны написать дочерний процесс:

char buf[7];
int left = 6;
int so_far = 0;   // instead of so_far, (6 - left) could also be used
while (left > 0)
     int num_read = read(fd[0][0], buf + so_far, left);
     left -= num_read;
     so_far += num_read;
}
buf[so_far] = '\0';
printf("%s\n", buf);     
0 голосов
/ 02 апреля 2012

Я подозреваю, что вы не закрыли fd "write" в дочернем процессе, поэтому вызов read будет блокировать, что, в свою очередь, блокирует wait в родительском процессе.

Также:если вы что-то пропустили в своем вопросе, как в ответе на ответ @ anatolyg, вам следует отредактировать вопрос.Это тот же ответ, который я бы дал сначала.

0 голосов
/ 02 апреля 2012

Два процесса зашли в тупик, каждый ждет другого.Вы хотите, чтобы дочерний процесс прекратил обработку, но он ожидает родительского процесса, потому что он не «знает», что родительский процесс больше не будет отправлять данные.Чтобы это стало понятно ребенку, закройте пишущий конец трубы:

write(fd[0][1], "12", 2);
write(fd[0][1], "14", 2);
write(fd[0][1], "15", 2);
printf("done!\n");
close(fd[0][1]);
wait(NULL);
...