色yeye在线视频观看_亚洲人亚洲精品成人网站_一级毛片免费播放_91精品一区二区中文字幕_一区二区三区日本视频_成人性生交大免费看

當(dāng)前位置:首頁(yè) > 嵌入式培訓(xùn) > 嵌入式學(xué)習(xí) > 講師博文 > 進(jìn)程間通信之信號(hào)

進(jìn)程間通信之信號(hào) 時(shí)間:2018-03-13      來(lái)源:進(jìn)程間通信講解

一:信號(hào)的基本介紹

信號(hào)是在軟件層次上對(duì)中斷機(jī)制的一種模擬,是一種異步通信方式(進(jìn)程在運(yùn)行過(guò)程中,隨時(shí)可能被各種信號(hào)打斷)。

信號(hào)可以直接進(jìn)行用戶(hù)空間進(jìn)程和內(nèi)核進(jìn)程之間的交互,內(nèi)核進(jìn)程也可以利用它來(lái)通知用戶(hù)空間進(jìn)程發(fā)生了那些系統(tǒng)事件。

如果該進(jìn)程當(dāng)前并未處于執(zhí)行態(tài),則該信號(hào)就由內(nèi)核保存起來(lái),直到該進(jìn)

程恢復(fù)執(zhí)行再傳遞個(gè)它;如果一個(gè)信號(hào)被進(jìn)程設(shè)置為阻塞,則該信號(hào)的傳遞被延遲,直到其阻塞取消時(shí)才被傳遞給進(jìn)程。

二:信號(hào)的產(chǎn)生

A.用戶(hù)在終端按下某些鍵時(shí),終端驅(qū)動(dòng)程序會(huì)發(fā)送信號(hào)給前臺(tái)進(jìn)程,例如ctr+c產(chǎn)生SIGINT, ctr + \產(chǎn)生SIGQUI信號(hào),ctr + z產(chǎn)生SIGTSTP。

B.硬件異常產(chǎn)生信號(hào),這些條件由硬件檢測(cè)到并通知內(nèi)核,然后內(nèi)核向當(dāng)前進(jìn)程發(fā)送適當(dāng)?shù)男盘?hào)。例如當(dāng)前進(jìn)程執(zhí)行了除以0的指令,CPU的運(yùn)算單元會(huì)產(chǎn)生異常,內(nèi)核將這個(gè)異常解釋為SIGFPE信號(hào)發(fā)送給進(jìn)程。再比如當(dāng)前進(jìn)程訪問(wèn)了非法內(nèi)存地址,MMU會(huì)產(chǎn)生異常,內(nèi)核將這個(gè)異常解釋為SIGSEGV信號(hào)發(fā)送給當(dāng)前進(jìn)程 。我們常見(jiàn)的段錯(cuò)誤。

C.一個(gè)進(jìn)程調(diào)用int kill(pid_t pid,int sig)函數(shù)可以給另一個(gè)進(jìn)程發(fā)送信號(hào)。

D.可以用kill命令給某個(gè)進(jìn)程發(fā)送信號(hào),如果不明確指定信號(hào)則發(fā)送SIGTERM信號(hào),該信號(hào)的默認(rèn)處理動(dòng)作是終止進(jìn)程。

E.當(dāng)內(nèi)核檢測(cè)到某種軟件條件發(fā)生時(shí)也可以通過(guò)信號(hào)通知進(jìn)程,例如鬧鐘超時(shí)產(chǎn)生

SIGALRM信號(hào),向讀端已關(guān)閉的管道寫(xiě)數(shù)據(jù)時(shí)產(chǎn)生SIGPIPE信號(hào)。

三:linux操作系統(tǒng)支持的信號(hào)

A. kill -l命令查看當(dāng)前系統(tǒng)支持的所有的信號(hào)

進(jìn)程間通信之信號(hào)

B:常用信號(hào)的含義

信號(hào)名 含義 默認(rèn)操作
 
SIGHUP
該信號(hào)在用戶(hù)終端連接(正常或非正常)結(jié)束時(shí)發(fā)出,通常是在終端的控制進(jìn)程結(jié)束時(shí),通知同一會(huì)話內(nèi)的各個(gè)作業(yè)與控制終端不再關(guān)聯(lián)。  
終止
 
SIGINT
該信號(hào)在用戶(hù)鍵入INTR字符(通常是Ctrl-C)時(shí)發(fā)出,終端驅(qū)動(dòng)程序發(fā)送此信號(hào)并送到前臺(tái)進(jìn)程中的每一個(gè)進(jìn)程。 終止
 
SIGQUIT
該信號(hào)和SIGINT類(lèi)似,但由QUIT字符(通常是Ctrl-\)來(lái)控制。 終止
 
SIGILL
該信號(hào)在一個(gè)進(jìn)程企圖執(zhí)行一條非法指令時(shí)(可執(zhí)行文件本身出現(xiàn)錯(cuò)誤,或者試圖執(zhí)行數(shù)據(jù)段、堆棧溢出時(shí))發(fā)
出。
 
終止
 
SIGFPE
該信號(hào)在發(fā)生致命的算術(shù)運(yùn)算錯(cuò)誤時(shí)發(fā)出。這里不僅包括浮點(diǎn)運(yùn)算錯(cuò)誤,還包括溢出及除數(shù)為0等其它所有的算術(shù)的錯(cuò)誤。  
終止
信號(hào)名 含義 默認(rèn)操作
 
SIGKILL
該信號(hào)用來(lái)立即結(jié)束程序的運(yùn)行,并且不能被阻塞、處理和忽略。 終止
SIGALRM 該信號(hào)當(dāng)一個(gè)定時(shí)器到時(shí)的時(shí)候發(fā)出。 終止
SIGSTOP 該信號(hào)用于暫停一個(gè)進(jìn)程,且不能被阻塞、處理或忽略。 暫停進(jìn)程
 
SIGTSTP
該信號(hào)用于暫停交互進(jìn)程,用戶(hù)可鍵入SUSP字符(通常是Ctrl-Z)發(fā)出這個(gè)信號(hào)。 暫停進(jìn)程
SIGCHLD 子進(jìn)程改變狀態(tài)時(shí),父進(jìn)程會(huì)收到這個(gè)信號(hào) 忽略
SIGABORT 該信號(hào)用于結(jié)束進(jìn)程 終止

四:linux中進(jìn)程對(duì)信號(hào)處理

忽略信號(hào),即對(duì)信號(hào)不做任何處理,但是有兩個(gè)信號(hào)不能忽略:即SIGKILL及

SIGSTOP。

捕捉信號(hào),定義并注冊(cè)信號(hào)處理函數(shù),當(dāng)信號(hào)發(fā)生時(shí),執(zhí)行相應(yīng)的處理函數(shù)。

【重點(diǎn)】。

執(zhí)行缺省操作,Linux對(duì)每種信號(hào)都規(guī)定了默認(rèn)操作

五:相關(guān)API

1:信號(hào)的發(fā)送(kill和raise)
#include <sys/types.h>
#include <signal.h>

函數(shù)原型:int kill(pid_t pid, int sig); 函數(shù)功能:給進(jìn)程 id 為 pid 的進(jìn)程發(fā)送信號(hào)

函數(shù)參數(shù):@param pid : 發(fā)送信號(hào)的目標(biāo)進(jìn)程的 id

@param sig : 發(fā)送的信號(hào)編號(hào),例如:9(SIGKILL) 返回值:成功調(diào)用返回 0 ,失敗返回 -1 ,并設(shè)置 errno
#include <signal.h>

函數(shù)原型:int raise(int sig); 函數(shù)功能:給當(dāng)前進(jìn)程自己發(fā)送信號(hào)

函數(shù)參數(shù):@param sig : 發(fā)送的信號(hào)編號(hào)

返回值:成功調(diào)用返回 0 ,失敗返回 -1 ,并設(shè)置 errno

.*練習(xí)

我們通過(guò)終端kill -9 某個(gè)進(jìn)程終止過(guò)一個(gè)進(jìn)程,現(xiàn)在我們使用kill函數(shù)來(lái)終止一下。過(guò)程:

父進(jìn)程創(chuàng)建一個(gè)子進(jìn)程,父進(jìn)程拿到子進(jìn)程的進(jìn)程ID;子進(jìn)程中while循環(huán)打印hello,sleep(1);

父進(jìn)程sleep(5)之后,給子進(jìn)程發(fā)送9這個(gè)信號(hào)來(lái)終止子進(jìn)程。

2:信號(hào)的捕捉(signal)

知識(shí)點(diǎn)回顧

void func(int);//函數(shù)的聲明

void (*func)(int);//定義函數(shù)指針,指向void (int)類(lèi)型的函數(shù)typedef int a;//給int類(lèi)型的a起別名

typedef void (*funcp)(int);//給類(lèi)型為void (*)(int);的函數(shù)指針起別名funcp 捕捉信號(hào)的處理過(guò)程:

進(jìn)程間通信之信號(hào)

#include <signal.h>

typedef void (*sighandler_t)(int);//指向函數(shù)的指針,表示信號(hào)處理函數(shù)的形式sighandler_t signal(int signum, sighandler_t handler);

函數(shù)功能 : 將信號(hào)與信號(hào)處理函數(shù)進(jìn)行關(guān)聯(lián)函數(shù)參數(shù):@param signum : 信號(hào)的編號(hào)

@param handler : 信號(hào)處理函數(shù)的指針SIG_DFL : 表示默認(rèn)操作

SIG_IGN : 表示忽略信號(hào)(SIGKILL和SIGSTOP時(shí)不能被忽略的) 返回值:成功調(diào)用返回信號(hào)處理函數(shù)的指針,否則,返回SIG_ERR

進(jìn)程間通信之信號(hào)

注意:sighandler_t handler中的int保存的是調(diào)用這個(gè)函數(shù)是因?yàn)槟膫(gè)信號(hào)觸發(fā)的,帶過(guò)來(lái)對(duì)應(yīng)的信號(hào)值。

.* 練習(xí)

(1)忽略ctrl+c對(duì)進(jìn)程的終止信號(hào)。signal(SIGINT, SIG_IGN);

(2)在信號(hào)處理函數(shù)中將對(duì)應(yīng)的信號(hào)的描述信息進(jìn)行打印。

.* 練習(xí):

fork前采用signal信號(hào)處理函數(shù)不阻塞,不輪詢(xún)的方式回收僵尸態(tài)子進(jìn)程[waitpid()函數(shù)]。 在信號(hào)處理函數(shù)signal_handler()中對(duì)信號(hào)進(jìn)行收尸操作。然后利用fork函數(shù)創(chuàng)建一個(gè)子進(jìn)程。休眠10s后退出。父進(jìn)程是一個(gè)死循環(huán),每秒輸出"father do something…"的字符串。

提示:

子進(jìn)程在終止時(shí)會(huì)給父進(jìn)程發(fā)SIGCHLD,該信號(hào)的默認(rèn)處理動(dòng)作是忽略,父進(jìn)程可以自定義SIGCHLD信號(hào)的處理函數(shù)。我們這里調(diào)用waitpid非阻塞的回收僵尸態(tài)子進(jìn)程。這樣父進(jìn)程只需要專(zhuān)心處理自己的工作,不必關(guān)心子進(jìn)程了,子進(jìn)程終止時(shí)會(huì)通知父進(jìn)程,父進(jìn)程在信號(hào)處理函數(shù)中調(diào)用waitpid函數(shù)清理子進(jìn)程即可。

一般信號(hào)對(duì)僵尸態(tài)子進(jìn)程的處理方法:

<1>父進(jìn)程采用signal(SIGCHLD, hand_signal),采用信號(hào)處理函數(shù),對(duì)接收到的SIGCHLD進(jìn)行進(jìn)行處理。在接收到SIGCHLD信號(hào)的時(shí)候,采用waitpid利用非阻塞的方式的釋放它們的資源。若是使用wait()函數(shù)的話,父進(jìn)程會(huì)阻塞。 [推薦使用]

<2>父進(jìn)程采用signal(SIGCHLD, SIG_IGN),忽略SIGCHLD信號(hào),這樣子進(jìn)程結(jié)束后,就不需要父進(jìn)程來(lái)wait和釋放資源。它會(huì)自動(dòng)被過(guò)繼給老祖宗init進(jìn)程,int進(jìn)程會(huì)負(fù)責(zé)釋放他的資源,這樣就不會(huì)產(chǎn)生僵尸態(tài)子進(jìn)程。

3:定時(shí)鬧鐘函數(shù)(alarm)

unsigned int alarm(unsigned int seconds);

函數(shù)功能:給進(jìn)程啟動(dòng)一個(gè)定時(shí)器,經(jīng)過(guò)seconds秒后把SIGALRM信號(hào)發(fā)送給當(dāng)前進(jìn)程。函數(shù)參數(shù):@seconds 秒

返回值:成功返回0,失敗返回 -1

注意:一個(gè)進(jìn)程只能有一個(gè)鬧鐘事件,若是多次使用alarm函數(shù),則鬧鐘時(shí)間被刷新。

.*練習(xí)

(1)main函數(shù)中設(shè)置2s定時(shí)器,然后注冊(cè)SIGALRM信號(hào)的處理函數(shù),處理函數(shù)中打印當(dāng)前時(shí)間到屏幕上

(2)我們現(xiàn)實(shí)中經(jīng)常有這樣的需求,需要每隔2s執(zhí)行某個(gè)函數(shù),這樣怎么處理呢? 答案:在定時(shí)器處理函數(shù)里邊,再次刷新鬧鐘alarm(2);
#include <stdio.h>
#include <time.h>
#include <signal.h>
 
void handler(int sig)
{
time_t tim = time(NULL);
struct tm *ptm = localtime(&tim);
printf("d-02d-02d 02d:02d:02d\n", ptm->tm_year+1900,
ptm->tm_mon+1, ptm->tm_mday, ptm->tm_hour, ptm->tm_min, ptm->tm_sec);
alarm(1); 
return;
}
int main(int argc, const char *argv[])
{
signal(SIGALRM, handler); alarm(1);
int n = 0; while(1)
{
printf("n = d\n", ++n); usleep(200);
}
return 0;
}

4:信號(hào)的等待(pause)

int pause(void);

特點(diǎn):掛起一個(gè)進(jìn)程,直到進(jìn)程收到一個(gè)信號(hào),進(jìn)程會(huì)繼續(xù)執(zhí)行

上邊的練習(xí),在while循環(huán)中pause()一下。現(xiàn)象:不加pause()之前printf("n = d\n",

++n);會(huì)200ms打印一次,然后1秒打印一次時(shí)間,加上pause()之后,現(xiàn)象則是1s打印一次printf("n = d\n", ++n),時(shí)間也是1s一次。因?yàn)閜ause()會(huì)將進(jìn)程掛起,接收到信號(hào)之后會(huì)繼續(xù),進(jìn)程1s接收一次ALARM信號(hào),則進(jìn)程會(huì)1s會(huì)被喚醒一次。

#include <stdio.h>
#include <time.h>
#include <signal.h>
 
void handler(int sig)
{

time_t tim = time(NULL);
struct tm *ptm = localtime(&tim);
printf("d-02d-02d 02d:02d:02d\n",          ptm->tm_year+1900, ptm->tm_mon+1, ptm->tm_mday, ptm->tm_hour,
ptm->tm_min, ptm->tm_sec); alarm(1);
 
return;
}
int main(int argc, const char *argv[])
{
signal(SIGALRM, handler); alarm(1);
int n = 0; while(1)
{
pause();
printf("n = d\n", ++n); usleep(200);
}
return 0;
}

上一篇:沒(méi)有了

下一篇:RS232轉(zhuǎn)RS485

熱點(diǎn)文章推薦
華清學(xué)員就業(yè)榜單
高薪學(xué)員經(jīng)驗(yàn)分享
熱點(diǎn)新聞推薦
前臺(tái)專(zhuān)線:010-82525158 企業(yè)培訓(xùn)洽談專(zhuān)線:010-82525379 院校合作洽談專(zhuān)線:010-82525379 Copyright © 2004-2022 北京華清遠(yuǎn)見(jiàn)科技集團(tuán)有限公司 版權(quán)所有 ,京ICP備16055225號(hào)-5京公海網(wǎng)安備11010802025203號(hào)

回到頂部

主站蜘蛛池模板: 亚洲色欲色欱WWW在线 | 我和子发生了性关系视频 | 国产一二区老熟女 | 麻豆免费进入 | 国产精品嫩草影院一二三区入口 | 国产真实乱对白精彩久久 | 10000拍拍18勿入免费看动漫 | 国产AV天堂亚洲国产AV麻豆 | 少妇的渴望HD高清在线播放 | 131美女爽爽爽爱做视频 | 最新亚洲av日韩av一区二区三区 | 久久精品国产精品久久久 | 国产aⅴ爽av久久久久久麻豆 | 中文字幕熟妇在线观看 | 熟女泄火一区二区三区在线 | 一二三四在线观看免费高清中文在线观看 | 成人禁片又硬又粗太爽了 | 野花社区在线视频最新 | 日韩吃奶摸下AA片免费观看 | 日本孕妇高潮孕交视频 | 少妇富婆高级按摩出水高潮 | 国内精选免费大片在线观看 | 大又大又粗又硬又爽少妇毛片 | 国模大尺度啪啪 | 女人被弄到高潮的免费视频 | 国产成人亚洲欧洲在线 | 夜夜操夜夜爱 | 中国黄色大片 | 欧美无人区码卡二卡3卡4乱码 | 久爱www人成视频在线观看 | 18未满禁止观看黄瓜视频 | 欧日韩在线观看 | ww欧日韩视频高清在线 | 可以直接在线观看的av | 亚洲欧洲日产国码久在线 | 又大又湿又紧又爽a视频 | 欧洲极品无码一区二区三区 | 国产小视频在线观看网站 | 亚洲中文字幕av每天更新 | 9lporm自拍视频区 | 蜜臀avwww国产天堂 |