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()マクロはどちらも、sへのポインタではなく、プレーンなsを想定してintいますint。これは、intへのポインタであるコードで、マクロを呼び出すときに整数の値を渡すためstatusに使用する必要があることを意味します。*status

それは言った:とにかく、なぜあなたmalloc()はシングルのために部屋を割り当てるように呼びかけているのですか?int正規変数を使用するだけで、&statusそれへのポインタが必要な場合。

また、プログラムが正常に完了したら、EXIT_SUCCESSから戻る必要があります。ではありません。main()1

于 2010-06-19T11:28:00.570 に答える