- 论坛徽章:
- 0
|
10可用积分
程序想实现的功能就是捕捉到SIGINT信号的时候重新启动,然后再捕捉到的时候再次重新启动。
exec函数执行的时候用一个全新的程序代替当前进程的数据段,堆栈和正文段。
在这里信号处理函数sig_handler中执行execl(PWD, "a.out", (char* )0)的时候,可执行程序a.out
代替了当前进程的数据段,堆栈和正文段,使程序重新运行
但是执行的时候:
./a.out
hello, program starting!
1111111111111111111111111 按ctrl+c
hello, caught SIGINT signal in sig_handler function!
hello, program starting!
1111111111111111111111111 重启后按ctrl+c后无法调用信号处理程序
- #include <stdio.h>
- #include <stdlib.h>
- #include <signal.h>
- #include <unistd.h>
- #define PWD "/home/xxxx/my_test/algorithm/c_expert/chap7/a.out"
- static void sig_handler(int signo);
- int main(int argc, char** argv)
- {
- struct sigaction act, oact;
- printf("hello, program starting!\n");
- act.sa_handler = sig_handler;
- sigemptyset(&act.sa_mask);
- act.sa_flags = 0;
- if(sigaction(SIGINT, &act, &oact) == -1){
- perror("sigaction error");
- exit(1);
- }
- printf("1111111111111111111111111\n");
- pause();
- exit(0);
- }
- static void sig_handler(int signo)
- {
- printf("hello, caught SIGINT signal in sig_handler function!\n");
- if(execl(PWD, "a.out", (char* )0) == -1){
- perror("execl error");
- exit(2);
- }
- }
复制代码 |
最佳答案
查看完整内容
是这样子的, 你在执行sig_handler的时候会屏蔽当前的这个信号, 也就是SIGINT这个信号, 这个以前讨论过的. 那么你从这个sig_handler调用execl的时候, 新的进程会继承原来进程的这个Process signal mask, 即屏蔽了哪些信号. 因此, 你在第二次按ctrl+C的时候由于这个信号被屏蔽掉了, 所以就不会运行信号处理函数. 你可以在pause()前面加上打印出来就可以看到了.[ 本帖最后由 scutan 于 2008-1-11 10:36 编辑 ]
|