国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Linux > 正文

linux之C編程學習——信號處理

2024-06-28 13:21:58
字體:
來源:轉載
供稿:網友
linux之C編程學習——信號處理

  信號處理是linux程序的一個特色。用信號處理來模擬操作系統的中斷功能。要想使用信號處理功能,你要做的就是填寫一個信號處理函數即可。

 1 #include <stdio.h>    2 #include <sys/types.h>    3 #include <stdlib.h>     4 #include <signal.h>     5    6 int flag = 1;     7    8 void func(int sig)       9 {   10     PRintf("I get a signal!/n");   11     flag = 0;     12 }    13   14 int main()     15 {    16     signal(SIGINT, func);   17     printf("pid:%ld/n",(long)getpid());   18   19     while(flag)  20     pause();   21   22     return 0;    23 }    

執行:

#gcc sig.c -o sig    #./sig    在另一終端:     #kill -INT 333//333是程序打印出的進程號 

  要對一個信號進行處理,就需要給出此信號發生時系統所調用的處理函數。可以對一個特定的信號(除去SIGKILL和SIGSTOP信號)注冊相應的處理函數。注冊某個信號的處理函數后,當進程接收到此信號時,無論進程處于何種狀態,就會停下當前的任務去執行此信號的處理函數。

1. 注冊信號函數

#include<signal.h>    void(*signal(int signumber,void ((*func)(int))(int)  

  signumber表示信號處理函數對應的信號。func是一個函數指針。此函數有一整型參數,并返回void型。其實func還可以取其他定值如:SIG_IGN,SIG_DFL。SIG_IGN表示:忽略signumber所指出的信號。SIG_DFL表示表示調用系統默認的處理函數。signal函數的返回值類型同參數func,是一個指向某個返回值為空并帶有一個整型參數的函數指針。其正確返回值應為上次該信號的處理函數。錯誤返回SIG_ERR。

signal示例如下:

 1 #include <stdio.h>   2 #include <sys/types.h>    3 #include <stdlib.h>    4 #include <signal.h>    5  6 void func(int sig)    7 {   8     printf("I get asignal!/n");   9 }   10 11 int main()   12 {    13     charbuffer[100];   14   15    if(signal(SIGINT, func) == SIG_ERR)  16      {  17          printf("signalerror exit now/n");  18          exit(0);  19      }  20      printf("pid:%ld/n",(long)getpid());  21   22    for(;;)  23      {  24          fgets(buffer,sizeof(buffer),stdin);  25          printf("bufferis:%s/n",buffer);  26      }  27      return 0;   28 }   

  通常情況下一個用戶進程需要處理多個信號。可以在一個程序中注冊多個信號處理函數。一個信號可以對應一個處理函數,同時多個信號可以對應一個處理函數。對于SIGINT信號 我們可以用ctrl+c或ctrl+z來中斷進程,來執行SIGINT注冊的函數。

2. 高級信號處理

在linux系統提供了一個功能更強的系統調用。

#include <signal.h>    int sigaction(int signumbet,const structsigaction *act,struct sigaction *oldact)

  此函數除能注冊信號函數外還提供了更加詳細的信息,確切了解進程接收到信號,發生的具體細節。struct sigaction的定義如下:

struct sigaction    {         void(*sa_handler)(int);         void(*sa_sigaction)(int,siginfo_t *,void *);         sigset_tsa_mask;         intsa_flags;  }  

sa_flags的取值如下表,取0表示選用所有默認選項。

SA_NOCLDSTOP:用于表示信號SIGCHLD,當子進程被中斷時,不產生此信號,當且僅當子進程結束時產生此信號。

SA_NOCLDWATI:當信號為SIGCHLD,時可避免子進程僵死。

SA_NODEFER:當信號處理函數正在進行時,不堵塞對于信號處理函數自身信號功能。

SA_NOMASK:同SA_NODEFER

SA_ONESHOT:當用戶注冊的信號處理函數被執行過一次后,該信號的處理函數被設為系統默認的處理函數。

SA_RESETHAND:同SA_ONESHOT

SA_RESTART:是本來不能重新于運行的系統調用自動重新運行。

SA_SIGINFO:表明信號處理函數是由SA_SIGACTION指定的,而不是由SA_HANDLER指定的,它將顯示更多的信號處理函數信息。

其實sinaction完全可以替換signal函數:

 1 #include <stdio.h>    2 #include <sys/types.h>    3 #include <stdlib.h>     4 #include <signal.h>     5      6 void func(int sig)      7 {     8     printf("I get a signal!/n");     9 }    10   11 int main()    12 {   13     char buffer[100];    14   15     struct sigaction act;  16     act.sa_handler=func;  17     sigemptyset(&act.sa_mask);  18     act.sa_flags = 0;  19   20     if(sigaction(SIGINT,&act, NULL) == -1)  21     {  22         printf("sigaction error exit now/n");  23         exit(0);  24     }  25   26     printf("pid:%ld/n",(long)getpid());   27   28     for(;;)  29     {  30         fgets(buffer,sizeof(buffer),stdin);  31         printf("buffer is:%s/n",buffer);  32     }  33   34     return 0;    35 }


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 葵青区| 洪洞县| 青州市| 千阳县| 若尔盖县| 宿州市| 成都市| 西乌| 弥勒县| 德州市| 滨州市| 克什克腾旗| 苗栗县| 开封市| 金秀| 香港| 南昌市| 枝江市| 襄垣县| 长阳| 乡城县| 信阳市| 白城市| 玉溪市| 延津县| 清流县| 疏勒县| 商丘市| 特克斯县| 上思县| 黄梅县| 枝江市| 柘荣县| 璧山县| 腾冲县| 南京市| 靖远县| 昭觉县| 博乐市| 满城县| 烟台市|