gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 04:26:13 24 4
gpt4 key购买 nike

我想知道如何在使用前等待我的 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 负有任何其他责任的时候。

关于c - 如何等待 exec 完成写入 C 中的管道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41124612/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com