Программа зависает при открытии именованного канала для записи на c — использование ожидания

#c #wait #named-pipes

#c #подождите #именованные каналы

Вопрос:

Это основное в test1.c:

 int main(int argc, char *argv[])
{
  int fd1,i, *foo;

  pid_t childpid;
  mkfifo("myfifo1", 0777);
  foo = malloc(10*sizeof(int));
  childpid=fork();
  if (childpid== -1){
      perror("Failed to forkn");
      exit(1);
    }
    if (childpid==0) {
      execlp(argv[1],argv[1],(char *) NULL);
      perror("exec failure ");
      exit(1);
    }
    else {
      wait(NULL);
      fd1 = open("myfifo1", O_RDONLY, 0);
      for (i=0; i<10; i  ) {
          read(fd1, amp;foo[i], sizeof(int));
      }
      for (i=0; i<10; i  ) {
          printf("%dn", foo[i]);
      }
   }
  close(fd1);
}
  

и это главное в test2.c:

 int main(int argc, char *argv[])
{
  int fd1, i, *foo;
  fd1 = open("myfifo1", O_WRONLY);
  if (fd1==-1) printf("errorn");
  foo = malloc(10*sizeof(int));
  for (i=0; i<10; i  ) {
      write(fd1, amp;i, sizeof(int));
  }
  printf("n");
  close(fd1);
}
  

Когда я запускаю ./test1 ./test2 программа зависает. Я предполагаю, что это происходит потому, что в test2.c открывается только один конец канала, и программа ожидает, пока это сделает другой. Однако этого никогда не происходит из-за:

 wait(NULL)
  

И действительно, если я удалю эту команду, программа будет работать нормально. Однако я подумал, что ожидание всегда полезно, и это мешает нам создавать процессы-зомби. Я ошибаюсь во всем этом? Есть ли какой-либо способ сохранить команду ожидания и заставить программу работать?

Заранее спасибо!

Комментарии:

1. Да, wait() должен вызываться родительским процессом. Но почему вы хотите вызвать его перед чтением в FIFO? Вы можете вызвать его после чтения FIFO. В качестве примечания, malloc() бесполезен в test2.c, поскольку вы не используете foo.

2. Я думаю, что сначала я должен писать, а затем читать. Вот почему я вызвал его перед чтением, чтобы дождаться, пока дочерний элемент не запишет. Да, вы правы насчет malloc, мой плохой.

3. Чтение блокируется до тех пор, пока что-то не будет записано на другой стороне FIFO

4. Хорошо, это имеет смысл. Большое спасибо