在閱讀APUE訊號一章時,我遇到Linux下對後台進程通過kill傳遞訊號不起作用的問題
具體情形與如下連結中的老兄一致:
http://bbs.csdn.net/topics/390335913?page=1#post-395188120
編譯執行下面的訊號程式,然後再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");elseif(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,也可以是工作編號。