Linux進程通信 | 信號

来源:https://www.cnblogs.com/Wayne123/archive/2023/03/16/17221123.html
-Advertisement-
Play Games

一、什麼是信號? 信號就像是一個突然的電話鈴聲,它會打斷正在進行的程式並引起其註意。 在Linux系統中,信號是一種軟體中斷,它通常是非同步發生的,可以用來通知進程某個事件已經發生。。每個信號都有一個唯一的編號,編號從1開始。進程可以通過註冊信號處理函數來處理信號。 二、信號的分類 Linux系統中的 ...


一、什麼是信號?

信號就像是一個突然的電話鈴聲,它會打斷正在進行的程式並引起其註意。

在Linux系統中,信號是一種軟體中斷,它通常是非同步發生的,可以用來通知進程某個事件已經發生。。每個信號都有一個唯一的編號,編號從1開始。進程可以通過註冊信號處理函數來處理信號。

二、信號的分類

Linux系統中的信號有兩類:標準信號和實時信號。

  • 標準信號是傳統Unix系統中的信號,編號範圍從1到31。

  • 實時信號是Linux獨有的信號,編號範圍從32到64。

三、信號的使用

1、註冊信號處理函數

在C語言中,可以使用signal函數來註冊信號處理函數。signal函數原型如下:

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

其中,signum參數表示要註冊的信號編號,handler參數表示信號處理函數。signal函數會返回上一次註冊的信號處理函數的地址。

下麵是一個簡單的例子,註冊SIGINT信號的處理函數:

#include <stdio.h>
#include <signal.h>
#include <stdlib.h>
 
void sigint_handler(int signo)
{
    printf("Received SIGINT signal!\n");
    exit(0);
}
 
int main()
{
    if (signal(SIGINT, sigint_handler) == SIG_ERR) {
        perror("signal");
        exit(1);
    }
 
    while (1) {
        printf("Hello World!\n");
        sleep(1);
    }
 
    return 0;
}

在上面的例子中,我們首先定義了一個名為sigint_handler的函數,用於處理SIGINT信號。

在main函數中,我們使用signal函數註冊了SIGINT信號的處理函數。如果signal函數返回的值是SIG_ERR,表示註冊信號處理函數失敗。

在迴圈中,我們只是簡單地輸出Hello World!字元串,並使用sleep函數暫停1秒鐘,以便觀察信號處理過程。

  • 編譯並運行,列印如下
[[email protected]:~]./signal
Hello World!
Hello World!
Hello World!

2、發送信號

2.1 kill函數

在Linux系統中,可以使用kill函數向進程發送信號。kill函數原型如下:

int kill(pid_t pid, int sig);

其中,pid參數表示進程的PID號,sig參數表示要發送的信號編號。如果pid參數的值是0,表示將信號發送給與當前進程屬於同一個進程組的所有進程。

下麵是一個例子,向指定進程發送SIGINT信號:

#include <stdio.h>
#include <signal.h>
#include <stdlib.h>
#include <unistd.h>
 
int main(int argc, char **argv)
{
    if (argc < 2) {
        fprintf(stderr, "Usage: %s <pid>\n", argv[0]);
    	exit(1);
	}

	pid_t pid = atoi(argv[1]);

	if (kill(pid, SIGINT) == -1) {
   		perror("kill");
    	exit(1);
	}

	return 0;
}

在上面的例子中,我們首先檢查命令行參數,如果參數不足,就列印使用說明並退出程式。

然後我們將命令行參數轉換為進程PID號,並使用kill函數向該進程發送SIGINT信號。如果kill函數返回-1,表示發送信號失敗。

  • 編譯並運行,列印如下
[[email protected]:~] ps aux | grep signal
wayne     5902  0.0  0.0   2028   280 pts/25   S+   19:04   0:00 ./signal
wayne     5904  0.0  0.0   6108   852 pts/24   S+   19:04   0:00 grep --color=auto signal

[[email protected]:~] ./killsignal 5902


// 此時上面運行的signal進程會收到信號,列印如下信息
Received SIGINT signal!

2.2 kill命令

我們也可以在shell中,用kill命令向進程發送信號,kill命令的語法如下:

kill [options] <pid>

其中,pid表示要發送信號的進程PID號。options是一些可選參數,例如,可以使用-9參數發送SIGKILL信號。

我們可以打開一個新的終端視窗,使用ps命令查看本文介紹的示常式序的PID號,然後使用kill命令向該進程發送SIGINT信號,示例如下:

$ ps aux | grep signal
wayne     5902  0.0  0.0   2028   280 pts/25   S+   19:04   0:00 ./signal
wayne     5904  0.0  0.0   6108   852 pts/24   S+   19:04   0:00 grep --color=auto signal

$ kill -2 5902

這裡我們使用ps命令查找名為signal的進程的PID號為5902,然後使用kill命令向該進程發送SIGINT信號(信號編號為2)。在執行kill命令之後,我們可以看到示常式序輸出了"Received SIGINT signal"這一行信息,說明信號處理函數已經被正確調用了。

四、常用信號

Linux系統中常用的信號有很多,下麵列出一些常用的信號及其含義:

信號編號 信號名稱 含義
1 SIGHUP 終端掛起或者控制進程結束
2 SIGINT 中斷信號,通常是CTRL-C
3 SIGQUIT 終止信號,通常是CTRL-\
9 SIGKILL 強制終止進程
11 SIGSEGV 段錯誤
15 SIGTERM 終止信號,通常是kill命令發送的信號
18 SIGCONT 繼續執行被暫停的進程
19 SIGSTOP 暫停進程
20 SIGTSTP 終端掛起或者CTRL-Z

五、小結

總的來說,Linux 信號是一種用於通知進程發生某個事件或錯誤的機制,可以用於處理異常情況、進程間通信等多種場景。

以上,如果覺得對你有幫助,點個贊再走吧,這樣@知微之見也有更新下去的動力!

也歡迎私信我,一起交流!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 背景: 我們項目一開始的所有提示都是中文,後來要做國際化。發現項目中的帶雙引號的中文居然有 2.3 w 多條!!!簡直讓人欲哭無淚... 如果使用人工改的話,首先不說正確率了。光是效率都是難難難。所以發揮了自己的才能寫了一個自動化工具。 思路: 首選讀取項目文件夾下的所有文件路徑 篩選路徑文件尾碼. ...
  • 接下來我們對依賴屬性進行一個簡單的剖析,從以下幾個方面入手吧。 1 - 為什麼是public static 首先說下為什麼是public 答:WPF有一種特殊屬性,叫附加屬性,需要直接訪問xxxxProperty的方法才能實現,所以xxxxProperty是public 的。 其次為什麼是靜態sta ...
  • 1. 選項 前面講完了.NET Core 下的配置系統,我們可以通過 IConfiguration 服務從各種來源的配置中讀取到配置信息,但是每次要用的時候都通過 Iconfiguration 讀取配置文件會比較不方便,而且效率低。.NET Core 體系下提供了一個選項系統,該功能用於實現以強類型 ...
  • 1、安裝 NLog.Web.AspNetCore 包 2、新增Configs文件夾,在Configs文件夾下新增nlog.config文件 nlog.config文件內容如下 <?xml version="1.0" encoding="utf-8" ?> <nlog xmlns="http://ww ...
  • 對於有輕微強迫症的技術人員來說,桌面有個IE圖標且刪不掉是非常不能忍受的,造成這種情況有可能是新裝的操作系統自帶,也有可能是裝了某個軟體(比如SQLyog)後…… 現將刪除IE圖標的方法整理如下: 1.打開運行對話框,兩種方式,點擊開始→運行;Win+R;輸入“gpedit.msc”,打開本地安全策 ...
  • 設置靜態網路 1、設置靜態網路,一是用來不讓地址飄忽不定,二來是為了訪問外網。 命令如下: [[email protected] ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33 修改內容: TYPE="Ethernet" BOOTPROTO="stat ...
  • web平臺搭建-LAMP(CentOS-7) 一.準備工作 環境要求: 操作系統:CentOS7.X 64位 關閉SELinux和firewalld防火牆 源碼包:https://pan.baidu.com/s/1P2fq706H8sPeHG6-nfHUSw 提取碼:9ruw 1.安裝編譯工具gcc ...
  • 創建軟鏈接 ln -s [源文件或目錄] [目標文件或目錄] 例如: 當前路徑創建test 引向/var/www/test 文件夾 ln –s /var/www/test test創建/var/test 引向/var/www/test 文件夾 ln –s /var/www/test /var/tes ...
一周排行
    -Advertisement-
    Play Games
  • .NET Core 選項系統的主要實現在 Microsoft.Extensions.Options 和 Microsoft.Extensions.Options.ConfigurationExtensions 兩個 Nuget 包。對於一個框架的源碼進行解讀,我們可以從我們常用的框架中的類或方法入手 ...
  • 最近在工作中遇到一個問題,就是我有多個線程會調用bitmap對象,運行的時候報錯,對象當前正在其他地方使用。第一反應肯定是加鎖啊,於是我就在每個用到bitmap的地方都加了鎖,但是運行之後依然報這個錯 測試代碼如下 using System; using System.Drawing; using ...
  • 一:背景 1. 講故事 前段時間有位朋友微信找到我,說他的程式使用 hsl 庫之後,採集 plc 時記憶體溢出,讓我幫忙看一下怎麼回事,哈哈,貌似是分析之旅中的第二次和 hsl 打交道,既然找到我,那就上 windbg 說話吧。 二:WinDbg 分析 1. 為什麼會記憶體溢出 簡單觀察程式的提交記憶體之 ...
  • 在 IIS 上啟用 Websocket 在 Windows Server 2012 或更高版本上啟用對 WebSocket 協議的支持: 備註 使用 IIS Express 時無需執行這些步驟 通過“管理”菜單或“伺服器管理器”中的鏈接使用“添加角色和功能”嚮導。 選擇“基於角色或基於功能的安裝”。 ...
  • C#-垃圾回收機制(GC) 什麼是GC 官網中有這麼一句話: The garbage collector is a common language runtime component that controls the allocation and release of managed memory ...
  • 呆了2個大屏行業的公司,對大屏幕有一些瞭解,所以整理下所瞭解的觸摸屏相關概念。方便自己以及進入這個行業的小伙伴們,能有個系統、快速的認知。 觸摸屏詳細的知識點,網上其實都有。整理資料過程中,我也瞭解了更多的觸摸屏知識,像聲波屏、光學屏之類的之前就沒接觸。下麵分不同的模塊,給大家介紹 交互觸摸屏類型 ...
  • 近段時間忙於各種項目和對【易排平臺】的優化,沒顧得上分享APS相關的小技巧,回頭看看小公眾號的關註人數早已達1500+,在此爭取時間寫一下這段時間在項目上及平臺優化過程中遇到的一些小技巧,以感謝諸位的關註。過去數月的解決的問題中,涉及最多的是規劃模型中,實現各種時間維度的功能,目前在平臺上也稍有成果 ...
  • 針對大量log日誌快速定位錯誤地方 動態查看日誌 tail -f catalina.ou 從頭打開日誌文件 cat catalina.ou 可以使用 >nanjiangtest.txt 輸出某個新日誌去查看 [[email protected] logs]# cat -n catalina.out |grep 7 ...
  • 前言 RocketMQ是阿裡巴巴旗下一款開源的MQ框架,經歷過雙十一考驗、Java編程語言實現,有非常好完整生態系統。RocketMQ作為一款純java、分散式、隊列模型的開源消息中間件,支持事務消息、順序消息、批量消息、定時消息、消息回溯等 本篇文章第一部分屬於一些核心概念和工作流程的講解;第二部 ...
  • 在java,c#類的成員修飾符包括,公有、私有、程式集可用的、受保護的。 對於python來說,只有兩個成員修飾符:公有成員,私有成員 成員修飾符是來修飾誰呢?當然是修飾成員了。那麼python類的成員包括什麼呢? python成員: 欄位,方法,屬性 每個類成員的修飾符有兩種: 公有成員:內部外部 ...