0

在这段代码中,我从命令行启动一个程序,当它从不同于 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;

}
4

1 回答 1

2

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

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

此外,您应该在成功完成程序后返回,而EXIT_SUCCESS不是.main()1

于 2010-06-19T11:28:00.570 回答