日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux内核层是什么,从用户层到内核层 - Linux内核中的信号机制_Linux编程_Linux公社-Linux系统门户网站...

發布時間:2024/9/19 linux 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux内核层是什么,从用户层到内核层 - Linux内核中的信号机制_Linux编程_Linux公社-Linux系统门户网站... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.簡介

如果進程要處理某一信號,那么要在進程中注冊該信號。注冊信號主要用來確定信號值及進程針對該信號值的動作之間的映射關系,即進程將要處理哪個進程和該信號被傳遞給進程時,將執行何種操作。主要有兩個函數實現信號的注冊:signal()和sigaction()。

2.signal()

signal()的函數原型如下:

void (*signal(int signum, void (*handler)(int)))(int);

在使用該調用的進程中加入以下頭文件:

#include

上述聲明格式比較復雜,如果不清楚如何使用,也可以通過下面這種類型定義的格式來使用(POSIX的定義):

typedef void (*sighandler_t)(int);

sighandler_t signal(int signum, sighandler_t handler);

但這種格式在不同的系統中有不同的類型定義,所以要使用這種格式,最好還是參考一下手冊。在調用中,參數signum指出要設置處理方法的信號。第二個參數handler是一個處理函數,或者是

SIG_IGN:忽略參數signum所指的信號。

SIG_DFL:恢復參數signum所指信號的處理方法為默認值。

傳遞給信號處理例程的整數參數是信號值,這樣可以使得一個信號處理例程處理多個信號。系統調用signal()返回值是指定信號signum前一次的處理例程或者錯誤時返回錯誤代碼SIG_ERR。

signal()通過系統調用sys_signal()為一個指定的信號設置用戶態處理函數。sys_signal()定義如下:

/*

* For backwards compatibility.? Functionality superseded by sigaction.

*/

asmlinkage unsigned long

sys_signal(int sig, __sighandler_t handler)

{

struct k_sigaction new_sa, old_sa;

int ret;

new_sa.sa.sa_handler = handler;

new_sa.sa.sa_flags = SA_ONESHOT | SA_NOMASK;

ret = do_sigaction(sig, &new_sa, &old_sa);

return ret ? ret : (unsigned long)old_sa.sa.sa_handler;

}

__sighandler_t的定義如下:

typedef void __signalfn_t(int);

typedef __signalfn_t __user *__sighandler_t;

信號由sys_signal()的第一個參數指定,信號處理函數的地址由第二個參數指定。sys_signal()根據這兩個參數設置一個k_sigaction結構,然后調用do_sigaction(),該函數的定義我們會在后面具體講解。

2.sigaction()

sigaction()的函數原型如下:

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

sigaction()對應的系統調用為do_sigaction(),下面我們具體講解do_sigaction()函數,其定義如下:

2.1do_sigaction()

int

do_sigaction(int sig, const struct k_sigaction *act, struct k_sigaction *oact)

{

struct k_sigaction *k;

if (!valid_signal(sig) || sig < 1 || (act && sig_kernel_only(sig)))

return -EINVAL;

k = &currentt->sighand->action[sig-1];

spin_lock_irq(&currentt->sighand->siglock);

if (signal_pending(current)) {

/*

* If there might be a fatal signal pending on multiple

* threads, make sure we take it before changing the action.

*/

spin_unlock_irq(&currentt->sighand->siglock);

return -ERESTARTNOINTR;

}

if (oact)//把原來的k_sigaction保存到oact結構中,這里是對整個數據結構進行復制

*oact = *k;

if (act) {

/*

* POSIX 3.3.1.3:

*? "Setting a signal action to SIG_IGN for a signal that is

*? pending shall cause the pending signal to be discarded,

*? whether or not it is blocked."

*

*? "Setting a signal action to SIG_DFL for a signal that is

*? pending and whose default action is to ignore the signal

*? (for example, SIGCHLD), shall cause the pending signal to

*? be discarded, whether or not it is blocked"

*/

if (act->sa.sa_handler == SIG_IGN ||

(act->sa.sa_handler == SIG_DFL &&

sig_kernel_ignore(sig))) {

/*

* This is a fairly rare case, so we only take the

* tasklist_lock once we're sure we'll need it.

* Now we must do this little unlock and relock

* dance to maintain the lock hierarchy.

*/

struct task_struct *t = current;

spin_unlock_irq(&t->sighand->siglock);

read_lock(&tasklist_lock);

spin_lock_irq(&t->sighand->siglock);

*k = *act; //把新的k_sigaction結構復制到進程的sighand->action中

sigdelsetmask(&k->sa.sa_mask,

sigmask(SIGKILL) | sigmask(SIGSTOP));

rm_from_queue(sigmask(sig), &t->signal->shared_pending);

do {

rm_from_queue(sigmask(sig), &t->pending);

recalc_sigpending_tsk(t);

t = next_thread(t);

} while (t != current);

spin_unlock_irq(&current->sighand->siglock);

read_unlock(&tasklist_lock);

return 0;

}

*k = *act; //把新的k_sigaction結構復制到進程的sighand->action中

sigdelsetmask(&k->sa.sa_mask,

sigmask(SIGKILL) | sigmask(SIGSTOP));

}

spin_unlock_irq(&currentt->sighand->siglock);

return 0;

}

總結

以上是生活随笔為你收集整理的linux内核层是什么,从用户层到内核层 - Linux内核中的信号机制_Linux编程_Linux公社-Linux系统门户网站...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 欧美三区视频 | 亚洲精品二区 | 告诉我真相俄剧在线观看 | 琪琪秋霞午夜被窝电影网 | 特级西西444www大精品视频 | 国产精品主播一区二区 | av在线收看 | 肥臀熟女一区二区三区 | 亚洲狼人伊人 | 亚洲一区二区三区在线播放 | 日韩福利片 | 久久精品小视频 | 3p视频在线观看 | 亚洲AV无码成人精品区东京热 | 两个女人互添下身爱爱 | 欧洲视频一区二区三区 | 粉嫩av网| 不卡av中文字幕 | 久久综合亚洲 | 日韩精品一区二区三区久久 | 99久久精品免费 | 一本视频 | 少妇人妻偷人精品一区二区 | 成人影音在线 | 亚洲第一免费网站 | 国产视频一区二区三区在线观看 | 欧美亚洲一区 | 日韩欧美国产精品综合嫩v 国产小毛片 | 色综合色综合网色综合 | 51自拍视频| 免费看成人aa片无码视频羞羞网 | 91极品身材尤物theporn | 又色又爽又黄无遮挡的免费视频 | gogo人体做爰aaaa | 国产精品嫩草久久久久 | 黄色网址国产 | 婷婷射| 91看片在线| 福利网站在线 | 精品一区二区在线免费观看 | 国产1区2区3区中文字幕 | 激情播播网 | 一本大道av伊人久久综合 | 亚洲天堂2016 | 国产伦精品一区二区三区免费 | 好男人香蕉影院 | 欧美一区免费观看 | 日本a v在线播放 | 自拍偷拍色综合 | 97成人精品视频在线观看 | 国产精品探花一区二区三区 | 国产精品视频999 | 亚洲午夜天堂 | 国语对白一区二区 | 国产成人亚洲一区二区 | 国产成人精品网站 | 高清一区二区三区 | 催眠调教艳妇成肉便小说 | 欧美日韩国产成人在线 | 天堂中文在线8 | 国产伦理吴梦梦伦理 | 久久青青草原 | 久久久久久无码精品人妻一区二区 | 97在线观看 | www.com毛片| h视频网站在线观看 | 国产视频你懂的 | 亚洲欧美在线综合 | 欧美tickle狂笑裸体vk | 韩国色网 | a片在线免费观看 | 麻豆成人精品 | 91精品久久香蕉国产线看观看 | 喷潮在线观看 | 精品啪啪| 日韩免费一级 | 欧美成人三级伦在线观看 | 岛国av中文字幕 | 日韩性大片 | 久久久久成人精品免费播放动漫 | 五月综合在线 | 国产欧美一级 | 97免费人妻无码视频 | 免费网站观看www在线观 | 狠狠干狠狠操 | 国产第4页| 日本少妇高潮喷水xxxxxxx | 午夜在线小视频 | 国产成人av一区二区三区在线观看 | 久久9久久| 无码国模国产在线观看 | 婷婷射丁香| 亚洲精品中文字幕在线播放 | 落日余晖图片 | 亚洲午夜精品一区二区三区 | 狠狠人妻久久久久久综合 | 日韩精品国产精品 | 久久一卡二卡 | 激情五月深爱五月 |