我有一个类似shell的程序,它在一个循环中运行;它接受几个命令并执行所需的功能。 程序仅在调用“getout”命令时退出。
让我们假设如果发生分段错误信号,我只是处理清理我的程序而不是退出程序我只想留在里面。 我可以使用siglongjmp()调用来实现这个目的。
我的问题:当我在恢复功能中再次运行我的shell程序时,当现在发生任何分段错误时,我的信号没有被清除,程序退出时出现分段错误。
请提出解决方案:
#include <stdio.h>
#include <signal.h>
#include <stdlib.h>
#include <setjmp.h>
sigjmp_buf mark;
void myhandler(int signo)
{
my_action();
siglongjmp(mark,-1);
}
recover()
{
my_program_loop();
}
my_program_loop()
{
/* accept some commands and do some functionality*/
/*some part of the code may cause segfault*/
}
main()
{
if (sigsetjmp(mark,0) != 0)
{
printf("siglongjmp() is called\n");
recover();
exit(1);
}
struct sigaction myhandle;
myhandle.sa_handler = myhandler;
sigemptyset(&myhandle.sa_mask);
myhandle.sa_flags = 0;
sigaction(SEGSEGV, &myhandle, NULL);
my_program_loop();
}
请帮忙。
答案 0 :(得分:2)
你的«my_program_loop»应该有问题,我可以很好地捕捉到这段代码的信号:
#include <stdio.h>
#include <signal.h>
#include <stdlib.h>
#include <setjmp.h>
sigjmp_buf mark;
void myhandler(int signo) {
printf("Sig caught\n");
siglongjmp(mark, -1);
}
void my_program_loop(void) {
char *p = NULL;
*p = 5;
}
void recover(void) {
my_program_loop();
}
int main(void) {
struct sigaction myhandle;
if (sigsetjmp(mark, 0) == -1) {
recover();
exit(1);
}
myhandle.sa_handler = myhandler;
sigemptyset(&myhandle.sa_mask);
myhandle.sa_flags = 0;
sigaction(SIGSEGV, &myhandle, NULL);
my_program_loop();
return 0;
}