亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 操作系統 > 正文

信號之signal函數

2024-06-28 13:28:30
字體:
來源:轉載
供稿:網友
信號之signal函數

UNIX系統的信號機制最簡單的接口是signal函數。signal函數的功能:為指定的信號安裝一個新的信號處理函數。

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

復雜原型分開看:

void (*signal( int signo, void (*func)(int) ) )(int);

函數名 :signal

函數參數 :int signo, void (*func)(int)

返回值類型:void (*)(int);

signo參數是信號名(參見:http://www.CUOXin.com/nufangrensheng/p/3514157.html中UNIX系統信號Signal欄下的信號名)。func的值是常量SIG_IGN、常量SIG_DFL或當接到此信號后要調用的函數的地址。如果指定SIG_IGN,則向內核表示忽略此信號(記住有兩個信號SIGKILL和SIGSTOP不能忽略)。如果指定SIG_DFL,則表示接到此信號后的動作是系統默認動作。當指定函數地址時,則在信號發生時,調用該函數,我們稱這種處理為“捕捉”該信號。稱此函數為信號處理程序(signal handler)或信號捕捉函數(signal-catching function)。

signal的返回值是指向之前的信號處理程序的指針。(之前的信號處理程序,也就是在執行signal(signo,func)之前,對信號signo的信號處理程序)

開頭所示的signal函數原型太復雜了,如果使用下面的typedef,則可使其簡單一些:

typedef void Sigfunc(int);

然后,可將signal函數原型寫成:

Sigfunc *signal(int,Sigfunc *);

如果查看系統的頭文件<signal.h>,則很可能會找到下列形式的聲明:

#define    SIG_ERR        ( void (*) () )-1#define    SIG_DFL        ( void (*) () )0#define    SIG_IGN        ( void (*) () )1

這些常量可用于代替“指向函數的指針,該函數需要一個整型參數,而且無返回值”。signal的第二個參數及其返回值就可用它們表示。這些常量所使用的三個值不一定是-1,0和1。但大多數UNIX系統都使用上面所示的值。

程序清單10-1 捕捉SIGUSR1和SIGUSR2的簡單程序

#include "apue.h"static void sig_usr(int);    /* one handler for both signals */intmain(void){    if(signal(SIGUSR1, sig_usr) == SIG_ERR)        err_sys("can't catch SIGUSR1");    if(signal(SIGUSR2, sig_usr) == SIG_ERR)        err_sys("can't catch SIGUSR2");    for(;;)        pause();}static voidsig_usr(int signo)    /* argument is signal number */{    if(signo == SIGUSR1)        PRintf("received SIGUSR1/n");    else if (signo == SIGUSR2)        printf("received SIGUSR2/n");    else        err_dump("received signal %d/n", signo);}

pause函數,它使調用進程在接到一個信號前掛起。

我們在后臺運行該程序,并且用kill(1)命令將信號傳送給它。注意,在UNIX中,殺死(kill)這個術語是不恰當的。kill(1)命令和kill(2)函數只是將一個信號送給一個進程或進程組。信號是否終止進程則取決于信號的類型,以及進程是否安排了捕捉該信號。

未命名

因為執行程序清單10-1的進程不捕捉SIGTERM信號,而針對該信號的系統默認動作是終止,所以當該進程發送SIGTERM信號后,該進程就會終止。

1、程序啟動

當執行一個程序時,所有信號的狀態都是系統默認或忽略。通常所有信號都被設置為它們的默認動作,除非調用exec的進程忽略該信號。確切地講,exec函數將原先設置為要捕捉的信號都更改為它們的默認動作,其他信號的狀態則不變(對于一個進程原先要捕捉的信號,當其執行一個新程序后,就自然不能再捕捉它了,因為信號捕捉函數的地址很可能在所執行的新程序文件中無意義)。

一個具體的例子是一個交互式shell如何處理針對后臺進程的中斷和退出信號。對于一個非作業控制shell,當在后臺執行一個進程時,例如:

cc main.c &

shell自動將后臺進程中對中斷和退出信號的處理方式設置為忽略。于是,當按中斷鍵時就不會影響到后臺進程。如果沒有執行這樣的處理,那么當按中斷鍵時,它不但會終止前臺進程,還會終止所有后臺進程。

很多捕捉這兩個信號的交互式程序具有下列形式的代碼:

void sig_int(int), sig_quit(int);if(signal(SIGINT, SIG_IGN) != SIG_IGN)    signal(SIGINT, sig_int);if(signal(SIGQUIT, SIG_IGN) != SIG_IGN)    signal(SIGQUIT, sig_quit);

這樣處理后,僅當信號當前未被忽略時,進程才會捕捉它們。

從signal的這兩種調用中也可以看到這種函數的限制:不改變信號的處理方式就不能確定信號的當前處理方式

2、進程創建

當一個進程調用fork時,其子進程繼承父進程的信號處理方式。因為子進程在開始時復制了父進程的存儲映像,所以信號捕捉函數的地址在子進程中是有意義的。

本篇博文內容摘自《UNIX環境高級編程》(第二版),僅作個人學習記錄所用。關于本書可參考:http://www.apuebook.com/。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产成人久久久精品一区| 欧美一级在线播放| 亚洲男人天堂网| 在线看欧美日韩| 日本一欧美一欧美一亚洲视频| 亚洲伊人久久大香线蕉av| 亚洲精品电影网站| 高潮白浆女日韩av免费看| 成人免费网视频| 亚洲美女黄色片| 日本精品久久久久久久| 国产成人精品久久亚洲高清不卡| 精品香蕉一区二区三区| 国产精品成人v| 亚洲电影免费观看高清完整版| 亚洲精品影视在线观看| 国产美女91呻吟求| 欧美午夜精品伦理| 亚洲视屏在线播放| 日韩视频在线免费观看| 久久精品久久久久久国产 免费| 国产噜噜噜噜噜久久久久久久久| 欧美天天综合色影久久精品| 久久精品国产69国产精品亚洲| 国产免费一区二区三区在线能观看| 精品一区二区三区四区| 深夜福利日韩在线看| 国产精自产拍久久久久久蜜| 欧美夫妻性视频| 欧美国产极速在线| 国产精品久久久久久久9999| 日韩精品免费观看| 久久久久五月天| 久久久综合免费视频| 久久在精品线影院精品国产| 亚洲自拍在线观看| 久久综合伊人77777蜜臀| 深夜福利一区二区| 国产不卡av在线免费观看| 精品国产一区二区三区久久久| 国产成人精品一区二区在线| 国产欧美日韩中文字幕| 亚洲一区免费网站| 成人欧美一区二区三区黑人| 日韩国产高清视频在线| 日韩欧美精品免费在线| 久久久久99精品久久久久| 午夜精品久久久久久99热| 国产精品第七十二页| 日韩精品中文字幕久久臀| 色婷婷综合久久久久中文字幕1| 国产成人精品优优av| 成人伊人精品色xxxx视频| 国产精品激情av电影在线观看| 69av在线播放| 日韩欧美成人精品| 国产福利视频一区| 92国产精品久久久久首页| 亚洲精品日韩久久久| 久久影视电视剧凤归四时歌| 午夜精品久久久久久99热| 亚洲欧美综合区自拍另类| 欧美亚洲另类视频| 日韩黄在线观看| 欧美性xxxx极品hd欧美风情| 国产精品福利在线观看| 亚洲免费福利视频| 欧美日本中文字幕| 揄拍成人国产精品视频| 亚洲第一精品久久忘忧草社区| 欧美激情视频一区| 国产精品久久久久久久av电影| 久久久人成影片一区二区三区观看| 国产91网红主播在线观看| 日本91av在线播放| 欧美伊久线香蕉线新在线| 日韩在线视频免费观看| 亚洲免费影视第一页| 亚洲午夜精品久久久久久久久久久久| 精品无人区太爽高潮在线播放| 国产精品久久久久久久久久免费| 国产成人精品免高潮费视频| 国产一区视频在线| 国产三级精品网站| 日av在线播放中文不卡| 亚洲精品一区中文| 国产99在线|中文| 2020欧美日韩在线视频| 午夜精品久久久久久久久久久久| 久久久久久久久久久久av| 日本一区二区在线免费播放| 欧美性猛交xxxx富婆| 精品亚洲一区二区三区四区五区| 欧美高清电影在线看| 日韩视频免费在线观看| 日韩av男人的天堂| 亚洲高清色综合| 欧美亚洲第一区| 5566日本婷婷色中文字幕97| 日韩大陆欧美高清视频区| 亚洲丝袜av一区| 亚洲理论在线a中文字幕| 7m精品福利视频导航| 亚洲天堂av在线免费| 国产免费一区二区三区在线能观看| 欧美网站在线观看| 日韩小视频在线| 国产精品一区二区三区在线播放| 亚洲人成在线一二| 日韩欧美黄色动漫| 亚洲美女精品成人在线视频| 色系列之999| 久久久久久久久久婷婷| 69精品小视频| 欧美与黑人午夜性猛交久久久| 国产成人啪精品视频免费网| 国产亚洲精品美女久久久久| 亚洲最大av在线| 亚洲欧美在线一区| 欧美高清视频在线观看| 精品一区二区电影| 欧美理论在线观看| 黑人巨大精品欧美一区二区| 久久免费精品日本久久中文字幕| 欧美理论电影在线播放| 亚洲精品999| 中文字幕精品国产| 插插插亚洲综合网| 欧美体内谢she精2性欧美| 亚洲午夜国产成人av电影男同| 中文字幕日韩专区| 日韩有码在线电影| 欧美激情第1页| 久久久久久久国产精品视频| 欧美激情在线观看| 亚洲女人天堂色在线7777| 色妞在线综合亚洲欧美| 欧美成人国产va精品日本一级| 亚洲国产欧美一区二区丝袜黑人| www.国产一区| 日韩精品在线播放| 欧美性20hd另类| 中文字幕久久精品| 中文字幕精品www乱入免费视频| 欧美日韩中文字幕综合视频| 日韩成人在线网站| 欧美日韩一区二区在线播放| 日韩精品日韩在线观看| 国产va免费精品高清在线观看| 亚洲2020天天堂在线观看| 亚洲白虎美女被爆操| 91久久精品一区| 中文字幕在线看视频国产欧美在线看完整| 欧美激情乱人伦一区| 国模私拍视频一区| 日韩成人激情视频| 国产精品久久久久久久久久尿| 黑人极品videos精品欧美裸| 国产视频丨精品|在线观看| 久久99久国产精品黄毛片入口| 国产精品av电影| 久久久在线免费观看| 国产精品美女在线| 日韩av最新在线|