Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C中等待exec完成在管道中的写入_C_Pipe_Exec - Fatal编程技术网

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

如何在C中等待exec完成在管道中的写入,c,pipe,exec,C,Pipe,Exec,我想知道如何在使用fd之前等待exec完成写入fd? 问题是,并不是所有的exec都是在管道中编写的。 因此,当我得到答案时,并不是所有的exec都被写入 以下是有关守则的部分: switch(fork()){ case -1: perror("fork"); case 0: // redirection de l'entré standard close(fd[0]);

我想知道如何在使用fd之前等待exec完成写入fd? 问题是,并不是所有的exec都是在管道中编写的。 因此,当我得到答案时,并不是所有的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()
调用移到读循环后面即可。这就是约翰·博林格(John Bollinger)在文章中的意思:你确实希望最终等待,但不是在你对孩子负有任何其他责任的时候

我试着不按您的要求等待,但这并不能解决任何问题,而且我不知道如何通过另一个读取循环再次读取数据


您不需要另一个读取循环-您已经拥有的读取循环很好。您只需将
wait()
调用移到读循环后面即可。这就是John Bollinger在他写文章时的意思:你确实希望最终等待,但不是在你对孩子有任何其他责任的时候。

家长可以
wait()
waitpid()
对写入管道的子进程负责,但是如果是家长负责从管道读取,那么你应该避免这样做,相反,只在子对象关闭其管道末端后等待(如果子对象之前没有关闭管道末端,则会在管道末端执行此操作)。否则,由于管道缓冲区填充到了容量,并且并没有人准备将其耗尽,您可能会面临死锁的风险。那个么我如何才能避免这种情况呢?我可以不等了吗?无论如何,你不应该等到作者写完后,读者才开始阅读。相反,您应该使用一个读取循环——就像您实际所做的那样——并继续读取,直到您收到预期的所有数据,否则将遇到EOF或错误。你最终还是想等,但不是在你对孩子有任何其他责任的时候。我没有立即发现你问题的根源。如果你编辑你的问题以呈现一个能反映你的情况的答案,你就更有可能得到一个有用的答案。很可能问题的本质不是你认为的那样。事实上,我不知道如何正确地问它^^^,但我试着不按你的要求等待,但这并不能解决任何问题,我不知道如何通过另一个读取循环再次读取数据。父级可以
wait()
waitpid()
对于写入管道的子进程,但如果是父进程负责从管道中读取,则应避免这样做,而应仅在子进程关闭其管道末端后等待(如果之前没有这样做,则在终止时会这样做)。否则,由于管道缓冲区填充到了容量,并且并没有人准备将其耗尽,您可能会面临死锁的风险。那个么我如何才能避免这种情况呢?我可以不等了吗?无论如何,你不应该等到作者写完后,读者才开始阅读。相反,您应该使用一个读取循环——就像您实际所做的那样——并继续读取,直到您收到预期的所有数据,否则将遇到EOF或错误。你最终还是想等,但不是在你对孩子有任何其他责任的时候。我没有立即发现你问题的根源。如果你编辑你的问题以呈现一个能反映你的情况的答案,你就更有可能得到一个有用的答案。很可能问题的本质不是你所想的。事实上,我不知道如何正确地问它^^^,但我试着不按你的要求等待,但它没有解决任何问题,我不知道如何通过另一个读取循环再次读取数据。