如何等待 exec 完成写入 C 中的管道
how to wait an exec finishes to write in pipe in C
我想知道如何在使用前等待我的 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.
}
感谢您的帮助。
I tried not to wait as you asked, but it doesn't resolve anything, and I don't see how can I read again datas by an other loop of read.
您不需要另一个读取循环 - 您已有的读取循环就可以了。您只需将 wait()
调用移到该读取循环后面。这就是 John Bollinger 在写道时的意思:你最终想要等待,但不是在你对 child.
负有任何其他责任的时候
我想知道如何在使用前等待我的 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.
}
感谢您的帮助。
I tried not to wait as you asked, but it doesn't resolve anything, and I don't see how can I read again datas by an other loop of read.
您不需要另一个读取循环 - 您已有的读取循环就可以了。您只需将 wait()
调用移到该读取循环后面。这就是 John Bollinger 在写道时的意思:你最终想要等待,但不是在你对 child.