【问题标题】:waitpid returns 0 when SIGINT (Crtl+c) on a children当子节点上的 SIGINT (Crtl+c) 时,waitpid 返回 0
【发布时间】:2018-05-21 22:08:17
【问题描述】:

我正在一个大学工作的终端工作,但在寻找已完成的孩子时遇到了麻烦。

我有一个列表,我在其中保存后台进程,这工作正常,但是当我将它带到前台并使用 ctrl+c 向他发送SIGINT 信号时,waitpid 在所有未完成的孩子上返回 1但我杀的那个。那是我的代码。我确定我的错误在于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()返回的值,你忽略了退出状态信息。如果我在调试它,我会捕获并打印或记录这两种信息。

标签: c waitpid


【解决方案1】:

waitpid 永远不应返回 1。它应该返回退出的孩子的-10pid。尝试使用waitpidwstatus 字段来准确调试waitpid 认为孩子身上发生的事情。

【讨论】:

  • ... pid 1 是原始进程,传统上是init;它永远不是另一个进程的子进程。
猜你喜欢
  • 1970-01-01
  • 2014-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-09
  • 2012-07-26
  • 1970-01-01
相关资源
最近更新 更多