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

歡迎訪問 生活随笔!

生活随笔

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

linux

Linux Signals 进程信号简介

發布時間:2025/1/21 linux 144 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux Signals 进程信号简介 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

2019獨角獸企業重金招聘Python工程師標準>>>

在Linux中,signal是一種局限較強的進程間通信方式。

主要有三種類型:

1. 從hardware signal到POSIX signal

????hardware signal也叫hardware interrupt,CPU中存放著 interrupt vectors 指向 存放在kernel space中的interrupt handling routine。

? ? 例: 鍵盤輸入;segmentation fault -> SIGSEGV?

2. 直接從kernel生成的POSIX signal

? ? 例:exit() -> SIGCHLD

3. 從一個進程發起到另一個進程的signal

? ? 例:進程885 執行了 “kill 1234” 代碼

?

POSIX signal

1.?Generated from CPU to kernel, or from CPU to processes

????例 1: Segmentation fault.
????????The signal is labeled SIGSEGV, which comes from CPU to kernel then to process.
????例 2: Floating point exception (e.g., divided by 0).
????????The signal is labeled SIGFPE, which is coming from CPU to process

2. From kernel to process

????例: Child process termination.
????????The signal is labeled SIGCHLD, which is coming from the kernel to process

3.?Generated from one process to another

? ? 例:?From terminals: E.g., “Ctrl C”, “Ctrl Z”
????????????Using programs: E.g., “kill”, “top”, etc.
????????????Using the “kill()” system call.

?

一些典型的signal

?

Asynchronous signal: 異步信號
– The signal received is NOT generated by the process itself。?So, its arrival time is usually not deterministic
– E.g., External hardware interrupt, another process sends ctrl-c


Synchronous signal: 同步信號
– The signal is caused by the process itself, its arrival time is usually deterministic
– E.g., A certain line leads to SIGFPE?
– E.g., A certain line accesses a memory region: SIGSEGV

?

kill() 方法

用于給特地進程發送POSIX signal

?

signal() 方法

更新當前進程的特定signal的處理方法,即signal handler

例:寫個無法“Ctrl+C”中止的小病毒

#include <stdio.h> #include <signal.h>void sig_handler(int sig) {if(sig == SIGINT)printf("\nCtrl + C\n"); }int main(void) {signal(SIGINT, sig_handler);printf("Press enter\n");getchar();printf("End of program\n");return 0; }

?

通常情況下,我們希望當signal handler處理完signal后,程序恢復到之前執行的地方;而有時候,則希望程序繼續運行下去。

?

signal的檢查方法

一個進程如何知道它收到了一個特定的signal?

在kernel space中,有一個bitmask

進程會不定期地去檢查這個bitmask,如果看到是1,則調用對應的handler,并重置為0。

因此,發送signal和處理signal是異步的。

?

pause()方法

The pause() system call suspends the calling process until a signal is received. 等待一個信號

?

有益的重寫signal handler

重寫SIGINT的handler,保證進程在被用戶ctrl-c 中止之前,進行一些必要的清理工作比如 關閉數據庫連接等。

?

alarm()方法

設置一個“鬧鐘”在指定時間后“響”起。

通過在hardware設置一個鬧鐘,到達時間后,hardware的signal會轉換成SIGALRM signal發送給進程,默認的處理方式是結束當前進程。

alarm()是一次性的,如果需要周期性的,則使用 settimer()方法

?

?

轉載于:https://my.oschina.net/Bruce370/blog/885260

總結

以上是生活随笔為你收集整理的Linux Signals 进程信号简介的全部內容,希望文章能夠幫你解決所遇到的問題。

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