J'ai un problème avec les macros WIFSIGNALED () / WTERMSIG (), après avoir utilisé waitpid ()
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;
}
La solution
Les macros WIFSIGNALED()
et WTERMSIG()
les deux attendent int
s réelles, 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 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
.