一道關於訊號的題

2021-06-01 19:07:12 字數 2035 閱讀 7828

用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,所以題目就是為了...