2010-06-19 10 views
0

Dans ce code C je lance un programme à partir de la ligne de commande et quand il est fermé à partir d'un signal différent de SIGTERM (signal pour normal fin) mon code devrait relancer le programme initial passé à partir de la ligne de commande. Mais ce n'est pas le cas, en fait mon code ne relance jamais le programme en disant qu'il est correctement terminé. En pratique ma condition "si (WTERMSIG (statut)! = SIGTERM)" fonctionne mal, POURQUOI ????? : '(J'ai un problème avec les macros WIFSIGNALED()/WTERMSIG(), après avoir utilisé waitpid()

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; 

} 

Répondre

1

Les WIFSIGNALED() et WTERMSIG() macros à la fois attendre int plaine s, pas des pointeurs vers int s 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 appelez-vous malloc() pour allouer de l'espace pour une seule int, de toute façon ? Utilisez simplement une variable normale et &status si vous avez besoin d'un pointeur.

En outre, vous devez renvoyer EXIT_SUCCESS de main() en cas de réussite de votre programme, et non 1.

+0

Problème résolu !! MERCI!!!! – Andrea