【问题标题】:C - getting WIFEXITED to return false for debuging purposesC - 让 WIFEXITED 返回 false 以进行调试
【发布时间】:2017-08-19 06:11:04
【问题描述】:

我有一个使用 fork() 创建子进程的简单程序,子进程使用 execvp() 函数执行 Unix 方法,例如:“ls”或“echo”。 当子进程正在工作时,父进程正在使用 wait() 函数等待。 孩子完成后,父母使用 WIFEXITED() 宏检查导致孩子结束的原因。如果孩子没有正常结束,父母会在屏幕上打印一条消息。 出于调试目的,我想让孩子正常终止,我尝试运行一个除以零但仍然是行的程序:

if(!WIFEXITED(status))

每次都返回真。

我的代码:

int main(){

pid_t p;
int status;
p = fork();
if (p == 0){//child process
    execlp("/bin/ls", "ls", NULL);
    exit(0);        
}else{
    wait(&status);
    if (!WIFEXITED(status))//if the child process terminated not normally
        fprintf(stderr, "\tError Occured!\n");//display error message 
}
return 0;}

来自 wait() 的手册页:

WIFEXITED(状态) 如果子进程正常终止,即调用 exit(3) 或 _exit(2),或从 main() 返回,则返回 true。

让 WIFEXITED() 返回 false 的正确方法是什么?

【问题讨论】:

    标签: c unix process operating-system wait


    【解决方案1】:

    让 WIFEXITED() 返回 false 的正确方法是什么?

    使用信号杀死孩子。那么WIFSIGNALED 将是真的,WTERMSIG 会给你信号。


    请注意,您还应该检查来自wait 的返回码。

    【讨论】:

    • 感谢您的回答。我不想使用信号,因为我正在测试一个极端情况,当孩子出现严重问题时,而不仅仅是信号情况......跨度>
    • @DavidDR 这正是 Unix 中WIFEXITED 的含义:这个进程没有退出(正常或异常):它因信号而死亡。换句话说,如果进程不复存在,要么WIFEXITED 为真,要么WIFSIGNALED
    猜你喜欢
    • 2015-04-22
    • 2019-08-02
    • 2014-06-09
    • 1970-01-01
    • 2018-06-15
    • 1970-01-01
    • 2010-12-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多