Родительский процесс не читает канал формы

0

У меня есть что-то вроде этого:

pipe
close(pipe[0]);
parent writes something to pipe
close(pipe[1]);
fork();
if(child)
{
  close(pipe[1]);
  child reads from pipe
  close(pipe[0]);
  child does some operations
  child writes to pipe
  close(pipe[1]);
}
else
{
  back to parent
  close(pipe[0]);
  wait(&code);
  parent tries to read what the terminated child just wrote but fails to do so
}

Я не совсем уверен, что я могу сделать, чтобы родитель читал от прерванного ребенка. Нужно ли мне использовать dup? Я не очень уверен в том, в каких ситуациях dup или dup2 полезен.

запись и чтение выполняются с использованием функций write() и read().

Я должен использовать каналы, а не fifo или другие средства для связи между процессами.

Теги:
pipe
fork

2 ответа

1
Лучший ответ

В примере из этой статьи говорится:

    #include <stdio.h>
    #include <unistd.h>
    #include <sys/types.h>

    main()
    {
            int     fd[2];
            pid_t   childpid;

            pipe(fd);

            if((childpid = fork()) == -1)
            {
                    perror("fork");
                    exit(1);
            }

            if(childpid == 0)
            {
                    /* Child process closes up input side of pipe */
                    close(fd[0]);
            }
            else
            {
                    /* Parent process closes up output side of pipe */
                    close(fd[1]);
            }
            .
            .
    }

IIRC, что так оно и есть. Самое главное - закрыть неиспользуемый fd в родительском и дочернем процессах.

  • 0
    Что означает IIRC?
  • 1
    Если я правильно помню
Показать ещё 7 комментариев
1

Я думаю, что у вас будет потребность в fifo и я не думаю, что вам тоже нужно использовать dup. Вот рабочий код:

#include <fcntl.h>
int main()
{
int e=open("fif",O_RDONLY|O_NONBLOCK);
if(fork()==0)
{
    int d=open("fif",O_WRONLY);
    write(d,"hi there\n",9);
    close(d);
    //sleep(5);
    exit(0);
}
wait();
char buf[15];
int n=read(e,buf,15);
buf[n]=0;
printf("%s", buf);
//wait();
return 0;
}
  • 0
    Мне нужно использовать трубы для этого. Это требование, извините.
  • 0
    @Edeph Это тот же принцип. Если бы вы прочитали ссылку на статью, которую я вам дал, вы бы увидели ...
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню