当前位置: 技术问答>linux和unix
关于进程间发送信号的问题
来源: 互联网 发布时间:2016-06-27
本文导语: 问题如下: 创建一个子进程用于监控各个进程的CPU利用率,若发现某个进程CPU利用率超过设定的上限值,就发信号给指定进程,指定进程在收到信号后转入信号处理函数,进行相应的处理。 代码大致如下: 监控进...
问题如下:
创建一个子进程用于监控各个进程的CPU利用率,若发现某个进程CPU利用率超过设定的上限值,就发信号给指定进程,指定进程在收到信号后转入信号处理函数,进行相应的处理。
代码大致如下:
监控进程:
kill(pid, SIGUSR1);
处理进程:
signal(SIGUSR1,sig_handler);
void sig_handler(int signum);
问题:
程序在Linux环境下能正常执行。
在IBM及HP安腾环境执行时,监控进程第一次发信号给处理进程时,处理进程能正确接受并处理,在监控进程第二次发信号给处理进程时,系统提示Signal 16,然后处理进程就退出了。
请教是什么原因导致处理进程退出呢?
创建一个子进程用于监控各个进程的CPU利用率,若发现某个进程CPU利用率超过设定的上限值,就发信号给指定进程,指定进程在收到信号后转入信号处理函数,进行相应的处理。
代码大致如下:
监控进程:
kill(pid, SIGUSR1);
处理进程:
signal(SIGUSR1,sig_handler);
void sig_handler(int signum);
问题:
程序在Linux环境下能正常执行。
在IBM及HP安腾环境执行时,监控进程第一次发信号给处理进程时,处理进程能正确接受并处理,在监控进程第二次发信号给处理进程时,系统提示Signal 16,然后处理进程就退出了。
请教是什么原因导致处理进程退出呢?
|
signal 16 的默认行为是关闭程序,但是安装了自己的信号处理函数就不会关闭进程,而是执行自己的信号处理函数。
有些操作系统,信号必须重新安装。
有些操作系统,信号必须重新安装。
|
1. signal 设置的handler, 在收到第一次信号后会被reset, 所以需要再handler中返回之前再次调用signal()进行设置。
2. 所以目前推荐的方法是sigaction(), 不需要反复设置
3. 单纯监视cpu使用率的方法好像不太好吧。目前有一种概念叫做maze, 就是在规定时间内cpu占用率达到一定程度就发生问题,有人已经实现了这样功能,你用maze + linux搜索看看
2. 所以目前推荐的方法是sigaction(), 不需要反复设置
3. 单纯监视cpu使用率的方法好像不太好吧。目前有一种概念叫做maze, 就是在规定时间内cpu占用率达到一定程度就发生问题,有人已经实现了这样功能,你用maze + linux搜索看看
|
你可以试试用sigaction()代替signal()
|
也许不同操作系统在处理信号的机制上有些区别。
你尝试一下在 信号处理函数里重新安装该信号,看看结果怎么样?
你尝试一下在 信号处理函数里重新安装该信号,看看结果怎么样?
|
Signal Value Action Comment
----------------------------------------------------------------------
SIGHUP 1 Term Hangup detected on controlling terminal
or death of controlling process
SIGINT 2 Term Interrupt from keyboard
SIGQUIT 3 Core Quit from keyboard
SIGILL 4 Core Illegal Instruction
SIGABRT 6 Core Abort signal from abort(3)
SIGFPE 8 Core Floating point exception
SIGKILL 9 Term Kill signal
SIGSEGV 11 Core Invalid memory reference
SIGPIPE 13 Term Broken pipe: write to pipe with no
readers
SIGALRM 14 Term Timer signal from alarm(2)
SIGTERM 15 Term Termination signal
SIGUSR1 30,10,16 Term User-defined signal 1
Linux下的信号处理和传统的UNIX确实是有不同的,而且根据man手册页里面的描述,貌似signal 16的行为确实是terminal程序
----------------------------------------------------------------------
SIGHUP 1 Term Hangup detected on controlling terminal
or death of controlling process
SIGINT 2 Term Interrupt from keyboard
SIGQUIT 3 Core Quit from keyboard
SIGILL 4 Core Illegal Instruction
SIGABRT 6 Core Abort signal from abort(3)
SIGFPE 8 Core Floating point exception
SIGKILL 9 Term Kill signal
SIGSEGV 11 Core Invalid memory reference
SIGPIPE 13 Term Broken pipe: write to pipe with no
readers
SIGALRM 14 Term Timer signal from alarm(2)
SIGTERM 15 Term Termination signal
SIGUSR1 30,10,16 Term User-defined signal 1
Linux下的信号处理和传统的UNIX确实是有不同的,而且根据man手册页里面的描述,貌似signal 16的行为确实是terminal程序