gpt4 book ai didi

c - 执行后台进程并从父级检查状态

转载 作者:太空宇宙 更新时间:2023-11-04 04:40:55 25 4
gpt4 key购买 nike

我目前正在尝试:

  1. 在子进程中使用 fork() 调用和 execvp() 执行后台进程。
  2. 如果对 execvp() 的调用成功,则将子进程的 PID 添加到列表中。
  3. 如果对 execvp() 的调用返回 -1(错误),则不要将 PID 添加到列表中。

我的问题是:如果 execvp() 返回 -1(例如,如果未找到可执行文件)我无法与父进程“通信”,因为我在 fork() 的子进程中.如果我使用 waitpid() 来等待 child ,我就不会运行后台进程(因为我失去了并发性)。

我尝试使用 WNOHANG 并使用 (WEXITSTATUS(status) == 1) 检查 *status 但它不起作用(因为父进程“立即”执行并且不知道子进程是否已经退出,或者那是我的想法)

我当前的代码:

void background(char *vector[]) {
pid_t childp;
int status;
childp=fork();
if (childp==-1){
perror("Error using fork \n");
return;
}
if (childp==0) { //Child process
if (execvp(vector[0],vector)==-1) {
perror("exec");
exit(1);
}
}
waitpid(-1, &status, WNOHANG);
if(WIFEXITED(status)) {
//Child exited
if (WEXITSTATUS(status) == 1) {
//Child exited with error
return;
}
}
if (insertProcess(childp,vector)==-1)
perror("Full list");
else
updateList();
}

目前我找到的唯一解决方案是在 waitpid 之前插入一个 sleep(1) 调用(来源:https://stackoverflow.com/a/26617152/1339354),但这看起来更像是一个 hack,而不是做得很好。还有其他想法吗?

最佳答案

如果您将 waitpid() 与 WNOHANG 一起使用,请务必指定子进程。如果不这样做,waitpid() 会返回最后一个 child 死亡的状态。

我不确定您是否试图将所有成功的过程保存在列表中。如果您正在尝试,为什么不总是插入,然后在它们死亡时删除该过程?控制信号SIGCHLD。在那里,使用 waitpid 查看哪个进程死亡并在列表中删除它。只需在创建进程时停用信号 SIGCHLD,将进程插入列表,然后再次激活信号。

关于c - 执行后台进程并从父级检查状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26683162/

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