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

當前位置:首頁 > 嵌入式培訓 > 嵌入式學習 > 講師博文 > 對Llinux下signal機制的一點認識

對Llinux下signal機制的一點認識 時間:2018-09-20      來源:未知

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

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

一、信號的發送

信號的產生方式有多種,可能是用戶程序使用相關函數進行發送,也可能是用戶通過外部輸入通知內核來產生信號等等。我們就那用戶程序來說明一下用戶空間信號的發送。

1)進程中:

int kill(pid_t pid, int sig);

int raise(int sig);

kill函數來給對應的進程發送信號。其中pid參數有三種類型:

pid 大于0時,就是給PID為pid的進程發送sig信號。

Pid 等于0時, 就是給和當前進程在同一進程組的所有進程發送sig信號。

Pid 等于-1時,會給所有有權限發送的進程發送sig信號,除了init進程。

父進程殺死子進程的示例代碼:

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函數就是進程給自己發送信號。

比如: raise(SIGKILL);就是進程的自殺信號。

2)線程的信號發送

int pthread_kill(pthread_t thread, int sig);

參數pthread_t就是指定要發送的線程標識符,sig就是要送的信號。

如果給線程發送的信號的默認處理方式是終止進程,那么也會導致進程直接退出。

比如:

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一旦發送SIGKILL信號,那么會導致整個進程也立刻退出。

二、信號的捕捉處理

常用的信號捕捉處理函數有兩個。

1)signal函數

typedef void (*sighandler_t)(int);

sighandler_t signal(int signum, sighandler_t handler);

參數 signum就是signal函數要捕捉的信號,參數handler就是對捕捉信號的處理函數。

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

void handler(int signo)

{

printf(“SIGINT is ignore\n”);

}

Int main()

{

….

signal(SIGINT, handler);

….

}

2) sigaction函數

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

參數signum: 要捕捉的信號

act : 對信號處理的結構體

oldact: 用來保存舊的信號處理方式的結構體

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函數的功能要比signal函數要強大,但是使用也比較復雜。

示例代碼:

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 通訊(一)

下一篇:安卓開發中使用緩沖機制

华清图书馆

0元电子书,限时免费申领

10本华清图书PDF版

扫码关注华清远见公众号
自动回复“2”,即可申领!
熱點文章推薦
華清學員就業榜單
高薪學員經驗分享
熱點新聞推薦
前臺專線:010-82525158 企業培訓洽談專線:010-82525379 院校合作洽談專線:010-82525379 Copyright © 2004-2022 北京華清遠見科技集團有限公司 版權所有 ,京ICP備16055225號-5京公海網安備11010802025203號

回到頂部

主站蜘蛛池模板: 丰满少妇高潮惨叫正在播放 | 任你操在线视频免费观看 | 日韩一区二区三区无码A片 字幕网91 | 精品久久久久久无码国产 | 影视先锋av资源站男人 | 无码国产精品久久一区免费 | 在线免费观看麻豆视频 | 少妇性饥渴无码A区免费 | 亚洲精品456在线观看 | 日本tubesex人妻 | 人人超碰人人爱超碰国产 | 成年无码动漫AV片在线尤物 | 欧美群伦性艳史黄94 | 欧美一曲二曲三曲的 | 成年女人看片永久免费视频 | 国产做a爰片久久毛片a片 | 一本大道嫩草av无码专区 | av爱爱爱 | 精产国品一二三产区区别麻豆 | 亚洲av久久无码精品九九 | 中文字幕无线观看中文字幕 | 欧美日韩免费在线观看视频 | 国产精品无码专区在线观看不卡 | 国产精品va无码欧美二区 | 欧美一级毛片免费网站 | 久久精品无码中文字幕老司机 | 国产一级精品绿帽视频 | 好硬好湿好爽再深一点动态图视频 | 无遮挡很爽很污很黄的女 | 97国语精品自产拍在线观看 | 中文字幕九九在线 | 中文字幕人妻少妇引诱隔壁 | 欧美S码亚洲码精品M码 | 国产chinasex对白videos麻豆 | 亚洲午夜精品a片一区二区无码l | 国产欧美亚洲精品第二区软件 | 亚洲国产精品久久久久4婷婷 | 久久精品国产72国产精 | 精品国产黑色丝袜高跟鞋 | 国产高清欧美情侣视频 | 亚洲AV无码成H人动漫无遮挡 |