在阅读APUE信号一章时,我遇到Linux下对后台进程通过kill传递信号不起作用的问题
编译执行下面的信号程序,然后再shell命令行:先让程序在后台运行,得到进程ID,然后用kill向该进程发送信号:kill -USR1 ID,但是没有结果
#include "apue.h"
static void sig_usr(int);
int main(void)
{
if(signal(SIGUSR1,sig_usr)==SIG_ERR)
err_sys("can not catch SIGUSR1");
if(signal(SIGUSR2,sig_usr)==SIG_ERR)
err_sys("can not catch SIGUSR2");
for( ; ; )
pause();
}
static void sig_usr(int signo)
{
if(signo==SIGUSR1)
printf("received sIGUSR1\n");
else if(signo==SIGUSR2)
printf("received sIGUSR2\n");
else
err_dump("received signal %d\n",signo);
}
这是我的解决方案:
这个问题应该是linux的进程后台运行的实现问题。可以换种方法进行实验:
1 在程序中加入打印getpid()函数
2 在前台运行该程序
3 新开一个终端窗口,在新开的终端窗口中输入:kill -USR1 [pid]
4 返回原终端,查看实验结果
kill
功能说明:删除执行中的程序或工作。
语 法:kill [-s <信息名称或编号>][程序] 或 kill [-l <信息编号>]
补充说明:kill可将指定的信息送至程序。预设的信息为SIGTERM(15),可将指定程序终止。若仍无法终止该程序,可使用SIGKILL(9)信息尝试强制删除程序。程序或工作的编号可利用ps指令或jobs指令查看。
参 数:
-l <信息编号> 若不加<信息编号>选项,则-l参数会列出全部的信息名称。
-s <信息名称或编号> 指定要送出的信息。
[程序] [程序]可以是程序的PID或是PGID,也可以是工作编号。