C 如何在没有堆芯转储的情况下捕获segfault
我正在做一个程序,必须知道他的孩子在执行时是否有SEGFULT 对于带堆芯转储和不带堆芯转储的segfault。第一次,我做得很顺利,但我找不到是什么让我无法捕捉到这个信号。根据手册,我应该收到10,7,10,但我不知道这意味着什么,我只能尝试其中一个,但10和7都没有做任何事情C 如何在没有堆芯转储的情况下捕获segfault,c,segmentation-fault,C,Segmentation Fault,我正在做一个程序,必须知道他的孩子在执行时是否有SEGFULT 对于带堆芯转储和不带堆芯转储的segfault。第一次,我做得很顺利,但我找不到是什么让我无法捕捉到这个信号。根据手册,我应该收到10,7,10,但我不知道这意味着什么,我只能尝试其中一个,但10和7都没有做任何事情 if (WTERMSIG(status) == 10) my_putstr("Segmentation fault \n"); else if (WTERMSIG(status) == 11) my_p
if (WTERMSIG(status) == 10)
my_putstr("Segmentation fault \n");
else if (WTERMSIG(status) == 11)
my_putstr("Segmentation fault (core dumped)\n");
您的问题有点不清楚,但您可以使用
WIFSIGNALED()
检查子进程是否收到任何信号,如果WIFSIGNALED(status)
为true表示子进程被任何信号异常终止
if(fork() == 0 ) {
/*... */
/* send the exit status of child by calling exit()*/
}
else {
int status;
wait(&status);/* here parent collect exit status , now parent wants to know--> normal termination or abnormal */
if(WIFEXITED(status)) { /* true if terminates normally */
printf("normally terminates\n",WEXITSTATUS(status));
}
if(WIFSIGNALED(status)) { /* if child terminated bcz of any other signal */
printf("terminated by signal\n",WTERMSIG(status));// bcz of what signal
}
}
要观察child是否在没有核心转储的情况下接收到SIGSEGV
,在上面的代码中,一旦child接收到SIGSEGV
,您可以通过调用sigaction()
&执行一些操作来设置信号处理程序
if(WTERMSIG(状态)==10)
我的计算机(“分段错误”);
否则如果(WTERMSIG(状态)==11)
my_putstr(“分段故障(堆芯转储)\n”)代码>
信号10
通常为SIGBUS
,信号11
通常为SIGSEGV
。他们的意思不同。打印“分割错误”对于两者都是混乱和错误的
此外,是否转储了core
与接收到的上述信号是正交的:如果ulimit-c
不是0,并且core
目标是可写的,那么这两个信号都将生成core
。此外,默认情况下,其他信号(例如,SIGILL
)也将生成一个core
以下是您可能想要的:
if (WIFSIGNALED(status)) {
printf("Terminated by signal %d%s\n", WTERMSIG(status),
WCOREDUMP(status) ? " (core dumped)" : "");
}
你用这个代码做过实验吗?你得到了什么结果?我已经试过了,它用core dump捕获segfault,但不是没有你应该调试,看看在这两种情况下都返回了什么状态,或者状态代码是否发生了变化。我可能没听说过,我的英语还远远不够完美。我想知道子segfault何时出现,并捕获没有核心转储的segfault,或者您可以在父级中使用pause()
,并将信号编号11
的处理程序设置为pause()
阻止父级执行,直到它没有接收到信号,但对于该信号,您需要更改默认操作。