У меня проблема с макросами WIFSIGNALED () / WTERMSIG () после использования waitpid () - PullRequest
0 голосов
/ 19 июня 2010

В этом коде C я запускаю программу из командной строки, и когда она закрывается от сигнала, отличного от SIGTERM (сигнал для нормального завершения), мой код должен перезапустить исходную программу, переданную из командной строки.Но это не так, на самом деле мой код никогда не перезапускает программу, говоря, что она правильно завершена. На практике мое условие «если (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 Ответ

1 голос
/ 19 июня 2010

Макросы WIFSIGNALED() и WTERMSIG() ожидают простые int с, а не указатели на int с. Это означает, что в вашем коде, где status является указателем на int, вам нужно использовать *status при вызове макросов, чтобы передать им значение целого числа.

Тем не менее: почему вы звоните malloc(), чтобы выделить место для одного int? Просто используйте обычную переменную и &status, если вам нужен указатель на нее.

Кроме того, вы должны возвращать EXIT_SUCCESS из main() при успешном завершении вашей программы, а не 1.

...