導航:首頁 > 操作系統 > linuxsigusr1

linuxsigusr1

發布時間:2022-08-30 23:45:44

1. linux系統中SIGUSR1信號是如何產生的。

首先,Linux中的信號可以通過kill -l命令獲取,如下圖所示:

如上圖所示,編號為1 ~ 31的信號為傳統UNIX支持的信號,是不可靠信號(非實時的),編號為32 ~ 63的信號是後來擴充的,稱做可靠信號(實時信號)。不可靠信號和可靠信號的區別在於前者不支持排隊,可能會造成信號丟失,而後者不會。


其次,SIGUSR1 ,這是留給用戶使用的信號。一般在編程中使用。舉例說明:sigqueue向本進程發送數據的信號,C語言代碼如下 :

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
void myhandler(int signo,siginfo_t *si,void *ucontext);
int main(){
union sigval val;//定義一個攜帶數據的共用體
struct sigaction oldact,act;
act.sa_sigaction=myhandler;
act.sa_flags=SA_SIGINFO;//表示使用sa_sigaction指示的函數,處理完恢復默認,不阻塞處理過程中到達下在被處理的信號
//注冊信號處理函數
sigaction(SIGUSR1,&act,&oldact);
char data[100];
int num=0;
while(num<10){
sleep(2);
printf("等待SIGUSR1信號的到來 ");
sprintf(data,"%d",num++);
val.sival_ptr=data;
sigqueue(getpid(),SIGUSR1,val);//向本進程發送一個信號
}

}
void myhandler(int signo,siginfo_t *si,void *ucontext){
printf("已經收到SIGUSR1信號 ");
printf("%s ",(char*)(si->si_ptr));

}

2. 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 進程號
另外,站長團上有產品團購,便宜有保證

3. linux 為什麼會一直有SIGUSR1信號

因為根本沒有信號。你的邏輯如同以下程序:

void speak_up(){
puts("I'm dying!!!");
}

int main(){
while(true){
speak_up();
sleep(1);
}
}

這個程序為什麼會一直說它要死了但是卻沒有死掉呢?

4. Linux下怎麼通過組合鍵產生sigusr1信號

SIGUSR1 不是終端產生的信號
kill -USR1 pid

5. linux下關於signal(SIGUSR1,sig_usr)==SIG_ERR的錯誤如何解決

SIG_ERR它表示一個函數指針,如果不出錯的話,signal()會返回以前的信號處理函數的地址。
你的SIGUSER1定義了嗎?默認的話,系統沒有這一個信號
SIG_ERR是這樣定義的
#define SIG_ERR (void (*) () ) -1

6. linux中求怎麼通知epoll

讓其一開始就監聽一個pipe的讀端,如果要讓其停止,則向pipe的寫端寫入一位元組,或者關閉寫端等等。 這樣epoll_wait返回後,檢測狀態改變的是否為此pipe,,是,則進入退出處理過程。

或者首先設置一個標志位flag ,,, 向進程發送一個信號看看,先用signal(SIGUSR1, handler),
然後epoll_wait時,,向此進程發送信號kill(pid, SIGUSR1);
handler可以是空函數,什麼都不作。。 從理論上epoll_wait應該會返回-1, errno == EINTR. 然後你就檢測下某個flag是否置位,如果置位,代表要退出了。 這種方案沒試驗過。。 用上一種方案好些,

7. linux 可以定義幾個自定義的信號量,難道就只有SIGUSR1 SIGUSR2 這個兩個嗎 求大神解釋

你的想法是想讓自己的信號處理函數代替系統的信號處理函數吧,那個信號都可以發送,不過linux內核為用戶程序保留了兩個信號,一個是10 siguser1 還有12 siguser2,其他的信號都是系統所用,你也可以更改。

8. linux備份系統到新硬碟

連接好新硬碟,開機,進入系統(廢話!)
fdisk -l ; 由於我兩塊硬碟都是Sata的,所以fdisk -l出來的結果是sda(舊) sdb(新)
dd if=/dev/sda of=/dev/sdb ; 注意的是最好兩塊硬碟是同一容量和同一型號,否則比較麻煩。
等待,漫長的等待
關機,將兩個硬碟的介面更換一下。
finish
dd的方式有點類似於ghost的全盤復制,速度較慢,但不會出現ghost那樣無法啟動的現象。製作linux的軟raid1也可以嘗試用這種方式同步。
PS:dd過程中如果無聊,可以通過在另一個終端鍵入 killall -s SIGUSR1 dd 發送SIGUSR1信號獲取當前進度

閱讀全文

與linuxsigusr1相關的資料

熱點內容
數控車床子程序編程 瀏覽:103
floydwarshall演算法 瀏覽:713
丟失微信app怎麼找 瀏覽:248
php能寫前端嗎 瀏覽:3
伺服器如何更改raid模式 瀏覽:82
方舟伺服器怎麼導出來 瀏覽:606
手機顯示伺服器異常什麼鬼 瀏覽:377
新聞伺服器的網址是什麼 瀏覽:669
程序員年底招人 瀏覽:319
廣發app怎麼查房貸 瀏覽:860
安卓手機怎麼下土豆 瀏覽:921
只有一個app顯示網路異常怎麼回事 瀏覽:988
解壓玩具是水寶寶 瀏覽:817
壓縮機保護怎麼解決 瀏覽:944
單片機簡易電子時鍾 瀏覽:402
pdf影印版 瀏覽:689
單片機的中斷技術 瀏覽:626
表格加密才能打開 瀏覽:39
多態可以提高編譯可靠性嗎 瀏覽:599
拼好魔方的app怎麼下載 瀏覽:503