J'ai un problème avec les macros WIFSIGNALED () / WTERMSIG (), après avoir utilisé waitpid ()

StackOverflow https://stackoverflow.com/questions/3075304

  •  28-09-2019
  •  | 
  •  

Question

Dans ce code C i lancer un programme à partir de la ligne de commande et quand elle est fermée à partir d'un autre signal de SIGTERM (signal de fin de la normale) mon code doit relancer le programme initial transmis à partir de la ligne de commande. Mais ce n'est pas, en fait, mon code ne relaunchs programme en disant qu'il est bien pratique terminated.In ma condition « si (WTERMSIG (état)! = SIGTERM) » fonctionne mal, POURQUOI ????? : '(

Ceci est mon code:

#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;

}
Était-ce utile?

La solution

Les macros WIFSIGNALED() et WTERMSIG() les deux attendent ints réelles, pas des pointeurs vers ints. Cela signifie que dans votre code, où status est un pointeur vers un int, vous devez utiliser *status lorsque vous appelez les macros, les transmettre la valeur de l'entier.

Cela dit: pourquoi vous appelez malloc() pour allouer de l'espace pour une seule int, de toute façon? Il suffit d'utiliser une variable normale, et &status si vous avez besoin d'un pointeur vers elle.

En outre, vous devez retourner EXIT_SUCCESS de main() à la réussite de votre programme, et non 1.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top