日韩在线免费播放-日韩在线免费av-日韩在线免费-日韩在线毛片-国产高清不卡视频-国产高清不卡

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

進程間通信之信號 時間:2018-03-13      來源:進程間通信講解

一:信號的基本介紹

信號是在軟件層次上對中斷機制的一種模擬,是一種異步通信方式(進程在運行過程中,隨時可能被各種信號打斷)。

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

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

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

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

A.用戶在終端按下某些鍵時,終端驅(qū)動程序會發(fā)送信號給前臺進程,例如ctr+c產(chǎn)生SIGINT, ctr + \產(chǎn)生SIGQUI信號,ctr + z產(chǎn)生SIGTSTP。

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

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

D.可以用kill命令給某個進程發(fā)送信號,如果不明確指定信號則發(fā)送SIGTERM信號,該信號的默認處理動作是終止進程。

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

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

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

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

進程間通信之信號

B:常用信號的含義

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

四:linux中進程對信號處理

忽略信號,即對信號不做任何處理,但是有兩個信號不能忽略:即SIGKILL及

SIGSTOP。

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

【重點】。

執(zhí)行缺省操作,Linux對每種信號都規(guī)定了默認操作

五:相關(guān)API

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

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

函數(shù)參數(shù):@param pid : 發(fā)送信號的目標進程的 id

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

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

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

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

.*練習(xí)

我們通過終端kill -9 某個進程終止過一個進程,現(xiàn)在我們使用kill函數(shù)來終止一下。過程:

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

父進程sleep(5)之后,給子進程發(fā)送9這個信號來終止子進程。

2:信號的捕捉(signal)

知識點回顧

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

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

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

進程間通信之信號

#include <signal.h>

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

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

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

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

進程間通信之信號

注意:sighandler_t handler中的int保存的是調(diào)用這個函數(shù)是因為哪個信號觸發(fā)的,帶過來對應(yīng)的信號值。

.* 練習(xí)

(1)忽略ctrl+c對進程的終止信號。signal(SIGINT, SIG_IGN);

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

.* 練習(xí):

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

提示:

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

一般信號對僵尸態(tài)子進程的處理方法:

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

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

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

unsigned int alarm(unsigned int seconds);

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

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

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

.*練習(xí)

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

(2)我們現(xiàn)實中經(jīng)常有這樣的需求,需要每隔2s執(zhí)行某個函數(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:信號的等待(pause)

int pause(void);

特點:掛起一個進程,直到進程收到一個信號,進程會繼續(xù)執(zhí)行

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

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

#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;
}

上一篇:沒有了

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

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

回到頂部

主站蜘蛛池模板: 用力快点| 性感美女写真视频| 日本电影家庭教师| 小孩打屁股| 69视频污| 100条谐音歇后语| 刘乐| busty buffy| 女人帮妞儿| 北京新闻频道回看| 贝加尔湖畔钢琴谱| 破冰 电影| 杨玉环秘史| 爱欲1990未删减版播放| 二年级写玩具的作文| 舒强| 秀人网美女套图| 陈冠希的艳照门| 摇曳庄的幽奈小姐| 和平饭店电视剧42集免费观看| 红楼梦别传| 色戒在线观看视频| 安姨电影| 喂找谁呀 电影| 吴燕妮个人资料简介| 彭丹三级正版1996| 盲辉| 误杀1演员表| 无涯:杜琪峰的电影世界 电影| 怀孕肚脐眼凸起和凹进去有什么区别| 关鹏| 妈妈的花样年华演员表全部| 当代大学德语2答案| 杨笠 个人资料| 2025小升初真题卷英语| 啪啪电影网| 韩国我的养父电影免费观看| 行政职业能力测试2024题库及答案| 黄网站免费在线观看| 陈建斌电影| 哥谭骑士|