用fork建立兩個子程序,呼叫signal()讓父程序接收鍵盤上的中斷訊號(control-c),捕捉到訊號後父程序用kill()向子程序傳送自定義訊號,子程序捕捉到訊號後分別輸出如下資訊後終止:
child process 1 is killed by parent!
child process 2 is killed by parent!
父程序等待兩個子程序結束後,輸出如下資訊後終止:
parent process is killed!
現給出如下程式:
#include #include #include #include #include void waiting();
void stop();
static int wait_mark;
int main(int argc, const char *argv)
else
}else
return 0;
}void waiting()
void stop()
可以看到,應用程式執行後,在按下鍵盤control-c後顯示
parent process is killed!就返回了shell。為什麼沒有顯示應該顯示的另外兩句呢?
通過除錯發現,父程序在接收到control-c,傳送訊息給子程序讓子程序結束的時候,子程序就已經結束掉了,原因是子程序也接收到了control-c的按鍵並且預設結束了自己,也就是子程序並不是因為父程序傳送訊號通知自己結束而結束的,而是自己接收到的sigint使得自己結束的。那麼要得到正確的輸出就很簡單,可以這麼做:
在子程序中把乙個空函式註冊為處理訊號sigint的函式,這樣子程序接收了到control-c還可以繼續執行。
/* 定義乙個空函式 */
void blank()
在子程序建立好後:
signal(sigint, blank);
重新編譯執行程式,就可以得到正確結果了。
$ gcc a.c
$ ./a.out
^cchild process 1 is killed by parent!
child process 2 is killed by parent!
parent process is killed!
那麼,假如不允許修改原來的程式,也要列印出正確結果怎麼辦呢?
方法也很簡單,原來的程式之所以不能正確輸出結果是因為兩個子程序也接收到了control-c,因為這個按鍵是我們在shell裡傳送給程式的,解決的辦法就是單獨給父程序的傳送sigint。
首先編譯原來的程式:
$ gcc b.c
執行生成的可執行檔案:
$ ./a.out
然後開啟乙個新的shell,找出所有的a.out。
$ ps -e | grep 'a.out'
3147 pts/0 00:00:01 a.out
3148 pts/0 00:00:01 a.out
3149 pts/0 00:00:01 a.out
發現有三個a.out在執行,一般情況下數字小的就是父程序,也就是這裡的3147,我們給這個程序單獨傳送sigint:
$ kill -s int 3147
再切換回原來的shell,可以看到程序已經被終止了並且輸出了正確結果:
child process 1 is killed by parent!
child process 2 is killed by parent!
parent process is killed!
一道關於矩陣的題
wzz的視察 檔名 inspect 時限 1s 記憶體 256mb decription wzz擁有乙個王國。他的王國是長方形的,跨越了n個維度區和m個經度區,且在每個經度區和緯度區的交界處有一座城市 即wzz的王國一共有n m座城市 某一天早上,wzz從他的一萬平方公尺的大床上起來,他決定去視察一...
關於C 的一道題
閱讀下面程式,然後請寫出輸出結果 cpp view plaincopy include using namespace std int main void 輸出結果如下圖 分析 為什麼會這樣的結果呢?首先我們先分析一下程式,首先我們先看看第一組a和b,那麼a和b是什麼呢?根據我們所學,我們知道a和b...
一道關於訊號量的題目
答案 a.p s1 b.v s2 v s3 c.p s2 d.v s4 e.p s4 f.v s5 訊號量問題還可以理解,但是理解不了這道題.好好地對了對答案,發現個問題,題目裡沒有說s1是p1的訊號量,s2是p2的訊號量.題目用了大量的p1,s1,a,b,c,d 選項又是abcd,所以題目就是為了...