在此代码中,我从命令行启动一个程序,当它从不同于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;
}
答案 0 :(得分:1)
WIFSIGNALED()
和WTERMSIG()
宏都期望普通int
,而不是指向int
的指针。这意味着在代码中,status
是指向int的指针,在调用宏时需要使用*status
,以传递整数的值。
那说:你为什么打电话给malloc()
为一个int
分配空间呢?只需使用一个普通变量,如果你需要一个指向它的话&status
。
此外,成功完成您的计划后,您应该从EXIT_SUCCESS
返回main()
,而不是1
。