1. ホーム
  2. c

[解決済み] WIFSIGNALED()/WTERMSIG()マクロでwaitpid()を使用した後に不具合が発生しました。

2022-02-19 17:01:47

質問

このコードでは、コマンドラインからプログラムを起動し、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;

}

解決方法は?

その WIFSIGNALED()WTERMSIG() マクロは、どちらもプレーンな int へのポインタではなく int s. つまり、あなたのコードで status がint型へのポインタである場合、int型へのポインタは *status を呼び出すと、整数の値が渡されます。

とはいえ、なぜ malloc() のためのスペースを確保するために、1つの int どうせなら、、、?普通に変数を使えばいいし &status へのポインタが必要な場合。

また EXIT_SUCCESS から main() ではなく、プログラムが正常に終了したときに 1 .