我在大学终端工作,但在寻找已完成的 child 时遇到了麻烦。
我有一个列表,其中保存了后台进程,这工作正常,但是当我将其带到前台并使用 ctrl+c 向他发送 SIGINT
信号时,waitpid
对所有未完成的 child 返回 1,除了我杀死的 child 。这是我的代码。我确信我的错误在于 waitpid
,但我不知道为什么返回错误的值。我希望我的代码做的是选择何时使用 SIGINT
终止进程并终止该进程并将其从列表中删除,但保留未完成的命令。
int emptyBackground(List *list){
ListNode *aux = list->first;
ListNode *aux2 = NULL;
while(aux != NULL){
if(waitpid(aux->pid, NULL, WNOHANG) > 0){ // This waitpid returns a non expected value
if(aux2 != NULL){
aux2->next = aux->next;
free(aux);
aux = aux2->next;
}else{
list->first = aux->next;
free(aux);
aux = list->first;
}
}else{
aux2 = aux;
aux = aux->next;
}
}
return 0;
}
PD:我的列表有命令 pid、命令和指向下一个节点的指针。
最佳答案
waitpid
永远不应返回 1
。它应该返回退出的子进程的 -1
、0
或 pid
。尝试使用 waitpid
的 wstatus
字段来准确调试 waitpid
认为子进程发生了什么。
关于c - 当子进程上有 SIGINT (Crtl+c) 时,waitpid 返回 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47701194/