色偷偷偷亚洲综合网另类,亚洲欧美另类在线观看,欧美午夜激情在线,久久久精品一区

當(dāng)前位置:首頁 > 嵌入式培訓(xùn) > 嵌入式學(xué)習(xí) > 講師博文 > 對(duì)Llinux下signal機(jī)制的一點(diǎn)認(rèn)識(shí)

對(duì)Llinux下signal機(jī)制的一點(diǎn)認(rèn)識(shí) 時(shí)間:2018-09-20      來源:未知

Linux中的signal是一種異步處通信機(jī)制,信號(hào)類型分為可靠信號(hào)和非可靠信號(hào)兩種。所謂非可靠信號(hào)是linux繼承unix的編號(hào)從1至31號(hào)信號(hào),是用作特殊用處;可靠信號(hào)即linux中新添加的編號(hào)從34至64的信號(hào),此類信號(hào)可以用戶自定義使用。

由于linux的signal機(jī)制也經(jīng)過了一系列的改造,因此我們就拿現(xiàn)在的signal機(jī)制來分析一下signal的使用。

一、信號(hào)的發(fā)送

信號(hào)的產(chǎn)生方式有多種,可能是用戶程序使用相關(guān)函數(shù)進(jìn)行發(fā)送,也可能是用戶通過外部輸入通知內(nèi)核來產(chǎn)生信號(hào)等等。我們就那用戶程序來說明一下用戶空間信號(hào)的發(fā)送。

1)進(jìn)程中:

int kill(pid_t pid, int sig);

int raise(int sig);

kill函數(shù)來給對(duì)應(yīng)的進(jìn)程發(fā)送信號(hào)。其中pid參數(shù)有三種類型:

pid 大于0時(shí),就是給PID為pid的進(jìn)程發(fā)送sig信號(hào)。

Pid 等于0時(shí), 就是給和當(dāng)前進(jìn)程在同一進(jìn)程組的所有進(jìn)程發(fā)送sig信號(hào)。

Pid 等于-1時(shí),會(huì)給所有有權(quán)限發(fā)送的進(jìn)程發(fā)送sig信號(hào),除了init進(jìn)程。

父進(jìn)程殺死子進(jìn)程的示例代碼:

Pid = fork();

If (pid == 0)

{

Printf(“in the child process\n”);

While (1);

}

else if (pid > 0)

{

Printf(“in the parent process\n”);

Kill(getpid(), SIGKILL);

Wait(NULL);

}

return 0;

raise函數(shù)就是進(jìn)程給自己發(fā)送信號(hào)。

比如: raise(SIGKILL);就是進(jìn)程的自殺信號(hào)。

2)線程的信號(hào)發(fā)送

int pthread_kill(pthread_t thread, int sig);

參數(shù)pthread_t就是指定要發(fā)送的線程標(biāo)識(shí)符,sig就是要送的信號(hào)。

如果給線程發(fā)送的信號(hào)的默認(rèn)處理方式是終止進(jìn)程,那么也會(huì)導(dǎo)致進(jìn)程直接退出。

比如:

pthread_t thread1, thread2;

void handler1(void *arg);

void handler2(void*arg);

Int main(int argc, const char*argv[])

{

pthread_create(&thread1, NULL, handler1, NULL);

pthread_create(&thread2, NULL, handler2, NULL);

pthread_join(thread1, NULL);

pthread_join(thread2, NULL);

}

void handler1(void *arg)

{

While (1);

}

void handler2(void *arg)

{

pthread_kill(thread1, SIGKILL);

pthread_exit(0);

}

線程2一旦發(fā)送SIGKILL信號(hào),那么會(huì)導(dǎo)致整個(gè)進(jìn)程也立刻退出。

二、信號(hào)的捕捉處理

常用的信號(hào)捕捉處理函數(shù)有兩個(gè)。

1)signal函數(shù)

typedef void (*sighandler_t)(int);

sighandler_t signal(int signum, sighandler_t handler);

參數(shù) signum就是signal函數(shù)要捕捉的信號(hào),參數(shù)handler就是對(duì)捕捉信號(hào)的處理函數(shù)。

示例代碼:讓程序在執(zhí)行過程中不受crtl + C的影響

void handler(int signo)

{

printf(“SIGINT is ignore\n”);

}

Int main()

{

….

signal(SIGINT, handler);

….

}

2) sigaction函數(shù)

int sigaction (int signum, const struct sigaction *act, struct sigaction *oldact);

參數(shù)signum: 要捕捉的信號(hào)

act : 對(duì)信號(hào)處理的結(jié)構(gòu)體

oldact: 用來保存舊的信號(hào)處理方式的結(jié)構(gòu)體

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);

};

igaction函數(shù)的功能要比signal函數(shù)要強(qiáng)大,但是使用也比較復(fù)雜。

示例代碼:

void handler(int signo)

{

printf(“SIGINT is ignore\n”);

}

Int main()

{

struct sigaction new, old;

new.sa_handler = handler;

sigemptyset(&new.sa_mask);

new.sa_flags = 0;


sigaction(SIGINT, NULL, &old);

if (old.sa_handler != SIG_IGN)

{

sigaction(SIGINT, &new, NULL);

}

…….

}

上一篇:Android USB Host與HID 通訊(一)

下一篇:安卓開發(fā)中使用緩沖機(jī)制

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

回到頂部

色偷偷偷亚洲综合网另类,亚洲欧美另类在线观看,欧美午夜激情在线,久久久精品一区
主站蜘蛛池模板: 国产精品美女久久久久久免费| 一本一本久久a久久精品综合小说| 国产精品扒开腿做爽爽爽的视频| 日本最新高清不卡中文字幕| 日韩成人性视频| 久久久影视精品| 国产一区二区日韩| 国产欧美日韩中文| 欧美精品18videosex性欧美| 亚洲人永久免费| 成人妇女淫片aaaa视频| 欧美极品少妇xxxxⅹ免费视频| 国产suv精品一区二区三区88区| 国产精品主播视频| 欧美激情中文网| 日韩在线观看免费全集电视剧网站| 欧美日韩国产在线| 亚洲四色影视在线观看| 成人av色在线观看| 78色国产精品| 日韩视频免费观看| 日韩黄色在线免费观看| 国产日韩精品电影| 51久久精品夜色国产麻豆| 欧美日韩国产区| 久久亚洲成人精品| 国产一区二区免费| 国产丝袜精品视频| 亚洲free性xxxx护士hd| 国产91精品网站| 45www国产精品网站| 欧美高清视频一区二区| 欧美日韩国产页| 精品少妇v888av| 久久久精品免费视频| 在线a欧美视频| 亚洲欧美日韩精品久久| 日韩精品免费视频| 亚洲成avwww人| 91中文在线视频| 亚洲成人中文字幕|