嗨,目前我正在子进程的信号处理程序中收集子进程的回溯。然后计划使用消息队列将收集的回溯发送到父进程。我的问题是当子进程得到任何信号时。子信号处理程序运行,但通知父进程子进程正常退出,而不是子进程获取信号。下面是我的代码
void childProcess()
{
int h =0 ;
for(h=0;h<10;h++)
{
printf("child for loop running %dn",h);
//sleep(1);
int q = 1/0; // generate floating point exception
}
exit(0);
}
void signalhandler(int signum, siginfo_t *si, void *arg)
{
printf("signal received %sn",strsignal(signum));
printf("%dn",signum);
void *array[100];
int size = 100;
int addrLen = backtrace(&array,size);
char ** sym = backtrace_symbols(&array,addrLen);
int j = 0;
printf("Test crashed due to %sn",strsignal(signum));
for(j=0;j<addrLen;j++)
{
printf("%u : %sn",array[j],sym[j]);
}
raise(signum);
exit(signum);
}
void registerSignals()
{
struct sigaction sa;
memset(&sa, 0, sizeof(sa));
sigemptyset(&sa.sa_mask);
sa.sa_sigaction = signalhandler;
sa.sa_flags = SA_SIGINFO;
sigaction(SIGSEGV, &sa, NULL);
sigaction(SIGFPE, &sa, NULL);
}
int main()
{
//while(1)
{
pid_t pid;
pid = fork();
if(pid == 0)
{
// child
printf("child process id is %dn",getpid());
registerSignals();
childProcess();
}
else
{
printf("parent process id is %dn",getpid());
// parent
int iStatus;
pid_t childPID = waitpid(pid,&iStatus,0);
printf("iStatus is %dn",WIFEXITED(iStatus));
if(childPID == -1)
{
printf("wait pid failedn");
}
else if(WIFEXITED(iStatus)==1)
{
printf("child exited normally!n");
}
else if (WIFSIGNALED(iStatus)==1)
{
printf("child process terminated abnormally !!n");
int iSignalnumber = 0;
// to fetch the signal number
iSignalnumber = WTERMSIG(iStatus);
printf("child process terminated due to %sn",strsignal(iSignalnumber));
// to check core file is generated or not
if(WCOREDUMP(iStatus)==1)
{
printf("core file is generated n");
}
else
{
printf("core file is not generated n");
}
}
int h ;
for(h = 0; h<10;h++)
{
printf("parent executing : %dn",h);
}
}
printf("while loop executing with pid : %d n", getpid());
sleep(1);
}
}
我的要求是在子进程中提供信号处理程序之后父进程应该打印"子进程异常终止!!",但我是正在获取"child exit normally!"消息
来自wait()
的Linux文档:
WIFEXITED(wstatus)如果子项正常终止,即通过调用exit(3)或_exit(2),或从main()返回。
子信号处理程序使用exit()
结束进程,因此一切都按指定方式进行。
从信号处理程序中删除对exit()
的调用以获得预期结果。
信号处理程序内部对raise()
的调用很可能会导致递归调用,因此remove也是如此。