C 如何在没有堆芯转储的情况下捕获segfault

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

我正在做一个程序,必须知道他的孩子在执行时是否有SEGFULT

对于带堆芯转储和不带堆芯转储的segfault。第一次,我做得很顺利,但我找不到是什么让我无法捕捉到这个信号。根据手册,我应该收到10,7,10,但我不知道这意味着什么,我只能尝试其中一个,但10和7都没有做任何事情

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()
阻止父级执行,直到它没有接收到信号,但对于该信号,您需要更改默认操作。