使用waitpid()后,我的WIFSIGNALED()/ WTERMSIG()宏出现问题

时间:2010-06-19 11:24:06

标签: c sigterm waitpid

在此代码中,我从命令行启动一个程序,当它从不同于SIGTERM的信号(正常结束的信号)关闭时,我的代码应该重新启动从命令行传递的初始程序。但事实并非如此,实际上我的代码从未重新启动程序,说它已被正确终止。在实践中我的条件“if(WTERMSIG(status)!= SIGTERM)”工作不好,为什么????? :'(

这是我的代码:

#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdio.h>

int main(int argc, char*argv[])
{   
    pid_t pid;
    int* status=(int*)malloc(sizeof(int));
    int term;
    if(argc<2)
    {
        printf("Error: Too few arguments\n");
        exit(EXIT_FAILURE);
    }

    while(1)
    {
    pid=fork();

    if(pid!=0) /*father*/
    {
        waitpid(pid,status,0);
        //term=WIFSIGNALED(status);
        if(WIFSIGNALED(status))
        {
            if(WTERMSIG(status)!=SIGTERM)
            {
                printf("The program %d ended abnormally:\nRelaunching...\n",pid);
                sleep(1);
            }
            else
            printf("The program %d is properly terminated...\n",pid);
            break;

        }
        else
        {
            printf("Can not read the reason for termination\n");
        }

    }
    else    /*child*/
    {
        execvp(argv[1],argv+1);
        exit(EXIT_SUCCESS);
    }
    }

    return 1;

}

1 个答案:

答案 0 :(得分:1)

WIFSIGNALED()WTERMSIG()宏都期望普通int,而不是指向int的指针。这意味着在代码中,status是指向int的指针,在调用宏时需要使用*status,以传递整数的值。

那说:你为什么打电话给malloc()为一个int分配空间呢?只需使用一个普通变量,如果你需要一个指向它的话&status

此外,成功完成您的计划后,您应该从EXIT_SUCCESS返回main(),而不是1