при использовании wait () не удается прочитать канал? - PullRequest
0 голосов
/ 07 марта 2012

Вот небольшой кусок кода, родительский процесс записи канала и дочерний канал чтения, все работает нормально, прежде чем я добавлю 'wait ()' в родительский процесс.Я думаю, что не должно быть никакой разницы, но он просто застревает при вводе.Я довольно новичок в системном программировании.Кто-нибудь может помочь с этим?

int main() {
      char* msg = malloc(sizeof(100));
      int fd[2];
      pipe(fd);
      int status;


if (fork()!=0){
    close(fd[0]);
    dup2(fd[1],1);
    scanf("%s",msg);
    puts(msg);
    wait(&status);
}
else {
    char* buf = malloc(sizeof(100));
    close(fd[1]);
    dup2(fd[0],0);
    scanf("%s",buf);
    puts(buf);
}
return 0;}

Ответы [ 3 ]

1 голос
/ 07 марта 2012

Вы забыли закрыть fd[1] после вызова dup2 в родительском. Кроме того, вам нужно написать некоторый символ, который заставит scanf понять, что он прочитал конец строки. Закрытие стандартного вывода после вызова puts будет одним из способов.

0 голосов
/ 07 марта 2012

Вы должны сбросить stdout перед вызовом wait().

Ваша программа работала раньше без wait(), поскольку при выходе из родительского процесса выполнялась неявная очистка.

0 голосов
/ 07 марта 2012

Вы должны прочитать хорошую книгу по расширенному программированию в Unix , научиться использовать мультиплексные вызовы, такие как poll (2) (или select, или pselect, или ppoll), возможно, научитесь использовать SIGCHLD .Будьте осторожны, обработчик signal может вызывать только очень ограниченный набор функций (асинхронный) и часто должен устанавливать переменную volatile sig_atomic_t.

...