當前位置:編程學習大全網 - 源碼下載 - linux c signal函數

linux c signal函數

是第二次調用的時候輸出的,第壹次調用只是綁定了SIGUSR1的信號處理函數,不會進入該處理函數

為什麽會有這樣的輸出呢?

signal函數是將信號與處理函數進行綁定,成功綁定則返回綁定之前的信號處理函數。那麽來看看妳的代碼,第壹次調用將sig_fun1綁定,無輸出;第二次調用將sig_fun2綁定,也就是把sig_fun1替換下來,並且妳還調用了它,參數為30,所以會有那樣的輸出。

該如何改呢?

其實妳並沒有涉及到linux的信號處理機制,光綁定是不夠的,還需要發信號給它,才能真正進入信號處理過程。給妳壹個示例代碼吧

#include<signal.h>

#include<stdlib.h>

#include<stdio.h>

#include<unistd.h>

void sig_fun2(int signo)

{

printf("in sig_fun2:%d\n", signo);

}

void sig_fun1(int signo)

{

printf("in sig_fun1:%d\n", signo);

}

int main()

{

unsigned long i;

if (signal(SIGUSR1, sig_fun1) == SIG_ERR)

{

printf("signal fun1 error\n");

exit(1);

}

sleep(15);

(signal(SIGUSR1, sig_fun2))(30);

sleep(15);

printf("done\n");

return 0;

}

/****************************C 代碼完,下面是如何運行***************************/

首先編譯,假設生成可執行程序為test

然後運行,我用的是後臺運行: nohup ./test>output.txt &

註意,這種方法要將輸出重定向到文件output.txt(名字無所謂),然後妳會看到壹個數字,就是pid進程號

最後,在15秒之內發送信號:kill -SIGUSR1 進程號

現在妳就可以打開output.txt看輸出結果了。如果用sleep的話會被打斷,所以只有兩個輸出加上替換處理函數時的輸出***3個,也可以換成 int n=15;while(n--)sleep(1);

-------------------------------------------------------------

怎麽樣,加分吧

-------------------------------------------------------------

1.我就是想問第二次綁定sig_fun2的時候,調用了第壹次綁定的sig_fun1麽?

調用了, (signal(SIGUSR1, sig_fun2))(30);就是這壹句, signal(SIGUSR1, sig_fun2)是個函數指針,妳這樣寫就是調用它了,但是這和信號處理沒關系,寫成signal(SIGUSR1, sig_fun2);就可以了

這就是妳所說的成功則返回綁定之前的函數?

那當時綁定sig_fun1的時候,返回之前的處理函數是什麽

這個就是系統默認的了,比如SIGINT就是妳ctrl+c取消程序執行發送的信號,它的處理函數就是結束程序的壹系列動作,不過SIGUSR1是留給用戶自定義的信號,系統默認應該是啥也不做的壹個函數,例如void fun(int signo){},妳也可以第壹次綁定的時候就調用試試看對不對

2.還有我在看signal函數定義的時候,void(//...)(int) 最後傳入的這個int整形參數就是我們自定義sig_fun()中所接收的30麽我看例子裏面有的signal(SIGINT,myfunc);也沒有帶參數啊,搞不懂

是妳理解錯了,signal函數只是綁定,沒涉及到調用綁定函數,不用帶參數,信號處理函數不是像妳這樣調用的。callback回調妳知道吧,就是先做好壹個函數或過程放著,事件觸發的時候才調用。那個30是妳用普通函數調用的方式時的參數,跟信號處理壹點關系也沒有,妳用60,70也沒半毛錢關系。我猜妳是想要調用信號處理函數,然後迷糊了,其實我上面說的“kill -SIGUSR1 進程號”就是觸發程序調用該處理函數的信號,這和kill -9 殺死進程壹個道理,只不過處理函數不同,結果不壹樣。ctrl+c也可以用信號的方式發送,kill -2 進程號,或者 kill -SIGINT 進程號

另外,站長團上有產品團購,便宜有保證

  • 上一篇:free-hcgb是什麽?
  • 下一篇:定制衣櫃哪些品牌比較好
  • copyright 2024編程學習大全網