繁体   English   中英

如何等待一个exec完成在C中写入管道

[英]how to wait an exec finishes to write in pipe in C

我想知道如何在使用前等待我的exec完成写入fd? 问题是我的所有exec都不是在管道中写的。 因此,当我得到答案时,并非所有的执行官都写了。

这是相关代码的一部分:

   switch(fork()){
        case -1:
            perror("fork");

        case 0:
            // redirection de l'entré standard
            close(fd[0]);
            dup2(fd[1], 1);
            dup2(fd[1], 2);
            close(fd[1]);
            // éxécution de la commande courrante.
            execvp(d->command[0], d->command);
            perror("execvp");

        default:
          // gère les processus zombies.
          if(wait(NULL) == -1){
                perror("wait");
          }
          char buffer[550000] = {0};
          unlink(d->pipe1);
          unlink(d->tube2);
          unlink(tube2);
          //création du tube nommé pour le client.
          if(mkfifo(tube2, 0644) != 0)
          {
              perror("mkfifo");
              fprintf(stderr, "Impossible de créer le tube nommé.\n");
              exit(EXIT_FAILURE);
          }
          // ouverture de ce même tube
          if((d->entree_tube = open(tube2, O_WRONLY)) == -1)
          {
              perror("open");
              fprintf(stderr, "Impossible d'ouvrir l'entrée du tube nommé.\n");
              exit(EXIT_FAILURE);
          }
          close(fd[1]);
          // lecture du résultat de la commande stocké dans fd[0]
          while (read(fd[0], buffer, sizeof(buffer)) != 0)
          {
              //écriture du résultat dans l'entré du tube.
             if(write(d->entree_tube, buffer, strlen(buffer)) == -1){
                perror("write");
             }
             //réinitialisation du buffer stockant une partie du résultat de la commande.
             memset (buffer, 0, sizeof(buffer));
          }
          // on regarde si il y a eu le mot clé "fin" pour alerter la client que la commande est terminé
          // et on redonne la main à un autre client tentant de se connecter au démon.

   }

谢谢你的帮助。

我试着不要等你问,但它没有解决任何问题,我也看不出如何通过另一个读取循环读取数据。

你不需要另一个读取循环 - 你已经拥有的读取循环就好了。 您只需将wait()调用移到该读取循环后面。 这就是约翰·博林格写作时的意思: 你确实想要最终等待,但不是在你对孩子有任何其他责任的时候。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM