日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux 进程学习(四)------ sigaction 函数

發(fā)布時間:2023/11/30 linux 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux 进程学习(四)------ sigaction 函数 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

轉(zhuǎn)自:http://www.cnblogs.com/wblyuyang/archive/2012/11/13/2768923.html

使用 sigaction 函數(shù):
?signal 函數(shù)的使用方法簡單,但并不屬于 POSIX 標(biāo)準(zhǔn),在各類 UNIX 平臺上的實(shí)現(xiàn)不盡相同,因此其用途受

到了一定的限制。而 POSIX 標(biāo)準(zhǔn)定義的信號處理接口是 sigaction 函數(shù),其接口頭文件及原型如下:
?#include <signal.h>
?int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);

?◆ signum:要操作的信號。
?◆ act:要設(shè)置的對信號的新處理方式。
?◆ oldact:原來對信號的處理方式。
?◆ 返回值:0 表示成功,-1 表示有錯誤發(fā)生。

?struct sigaction 類型用來描述對信號的處理,定義如下:
?struct sigaction
?{
??void???? (*sa_handler)(int);
??void???? (*sa_sigaction)(int, siginfo_t *, void *);
??sigset_t? sa_mask;
??int?????? sa_flags;
??void???? (*sa_restorer)(void);
?};

?在這個結(jié)構(gòu)體中,成員 sa_handler 是一個函數(shù)指針,其含義與 signal 函數(shù)中的信號處理函數(shù)類似。成員

sa_sigaction 則是另一個信號處理函數(shù),它有三個參數(shù),可以獲得關(guān)于信號的更詳細(xì)的信息。當(dāng) sa_flags 成員的值

包含了 SA_SIGINFO 標(biāo)志時,系統(tǒng)將使用 sa_sigaction 函數(shù)作為信號處理函數(shù),否則使用 sa_handler 作為信號處理

函數(shù)。在某些系統(tǒng)中,成員 sa_handler 與 sa_sigaction 被放在聯(lián)合體中,因此使用時不要同時設(shè)置。
?sa_mask 成員用來指定在信號處理函數(shù)執(zhí)行期間需要被屏蔽的信號,特別是當(dāng)某個信號被處理時,它自身會被

自動放入進(jìn)程的信號掩碼,因此在信號處理函數(shù)執(zhí)行期間這個信號不會再度發(fā)生。
?sa_flags 成員用于指定信號處理的行為,它可以是一下值的“按位或”組合。
?
?◆ SA_RESTART:使被信號打斷的系統(tǒng)調(diào)用自動重新發(fā)起。
?◆ SA_NOCLDSTOP:使父進(jìn)程在它的子進(jìn)程暫停或繼續(xù)運(yùn)行時不會收到 SIGCHLD 信號。
?◆ SA_NOCLDWAIT:使父進(jìn)程在它的子進(jìn)程退出時不會收到 SIGCHLD 信號,這時子進(jìn)程如果退出也不會成為僵

尸進(jìn)程。
?◆ SA_NODEFER:使對信號的屏蔽無效,即在信號處理函數(shù)執(zhí)行期間仍能發(fā)出這個信號。
?◆ SA_RESETHAND:信號處理之后重新設(shè)置為默認(rèn)的處理方式。
?◆ SA_SIGINFO:使用 sa_sigaction 成員而不是 sa_handler 作為信號處理函數(shù)。

?re_restorer 成員則是一個已經(jīng)廢棄的數(shù)據(jù)域,不要使用。

?下面用一個例程來說明 sigaction 函數(shù)的使用,代碼如下:

1 #include <stdio.h> 2 #include <unistd.h> 3 #include <signal.h> 4 #include <errno.h> 5 6 static void sig_usr(int signum) 7 { 8 if(signum == SIGUSR1) 9 { 10 printf("SIGUSR1 received\n"); 11 } 12 else if(signum == SIGUSR2) 13 { 14 printf("SIGUSR2 received\n"); 15 } 16 else 17 { 18 printf("signal %d received\n", signum); 19 } 20 } 21 22 int main(void) 23 { 24 char buf[512]; 25 int n; 26 struct sigaction sa_usr; 27 sa_usr.sa_flags = 0; 28 sa_usr.sa_handler = sig_usr; //信號處理函數(shù) 29 30 sigaction(SIGUSR1, &sa_usr, NULL); 31 sigaction(SIGUSR2, &sa_usr, NULL); 32 33 printf("My PID is %d\n", getpid()); 34 35 while(1) 36 { 37 if((n = read(STDIN_FILENO, buf, 511)) == -1) 38 { 39 if(errno == EINTR) 40 { 41 printf("read is interrupted by signal\n"); 42 } 43 } 44 else 45 { 46 buf[n] = '\0'; 47 printf("%d bytes read: %s\n", n, buf); 48 } 49 } 50 51 return 0; 52 }

?在這個例程中使用 sigaction 函數(shù)為 SIGUSR1 和 SIGUSR2 信號注冊了處理函數(shù),然后從標(biāo)準(zhǔn)輸入讀入字符

。程序運(yùn)行后首先輸出自己的 PID,如:
?My PID is 5904
?
?這時如果從另外一個終端向進(jìn)程發(fā)送 SIGUSR1 或 SIGUSR2 信號,用類似如下的命令:
?kill -USR1 5904

?則程序?qū)⒗^續(xù)輸出如下內(nèi)容:
?SIGUSR1 received
?read is interrupted by signal
?
?這說明用 sigaction 注冊信號處理函數(shù)時,不會自動重新發(fā)起被信號打斷的系統(tǒng)調(diào)用。如果需要自動重新發(fā)

起,則要設(shè)置 SA_RESTART 標(biāo)志,比如在上述例程中可以進(jìn)行類似一下的設(shè)置:
?sa_usr.sa_flags = SA_RESTART;


總結(jié)

以上是生活随笔為你收集整理的Linux 进程学习(四)------ sigaction 函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。