APUE 3 -- 信號(signal)<I> :概念

来源:http://www.cnblogs.com/Sven7/archive/2017/08/30/7446261.html
-Advertisement-
Play Games

信號可以理解成一種軟體中斷。他提供了一種非同步處理事件的方式。每個信號都有一個與之對應的信號名,這些信號名都帶有SIG首碼,如:SIGABRT,SIGALARM。頭文件signal.h 中定義了所有的信號名,他們值為正整數常量。事實上,實現將個別信號定義在不同的頭文件中,只不過這些頭文件又被包含在了s ...


  信號可以理解成一種軟體中斷。他提供了一種非同步處理事件的方式。每個信號都有一個與之對應的信號名,這些信號名都帶有SIG首碼,如:SIGABRT,SIGALARM。頭文件signal.h 中定義了所有的信號名,他們值為正整數常量。事實上,實現將個別信號定義在不同的頭文件中,只不過這些頭文件又被包含在了signal.h中;這是因為內核不可能去包含應用於用戶級別程式的頭文件!因此,當用戶程式與內核同時需要某信息的定義時,通常的做法是把這個定義放到內核頭文件中,然後在用戶頭文件中包含這個內核頭文件。

unix系統信號列表:

當信號列表中的預設action為“terminal+core”時,他意味著進程的記憶體映像會留在進程目錄下的core文件中。core文件可以幫助大多數UNIX系統調試者來檢查進程終止時的狀態。但是,如果 a)進程設置了set-user-ID而且當前用戶不是進程文件的擁有者;或者 b)進程設置了 set-group-ID 而且當前用戶不是進程文件的用戶組擁有者;或者 c) 當前用戶下該用戶沒有寫入權;或者d) 此文件已存在而且當前用戶沒有寫入權;或者e)文件太大時core文件不會被創建。

 

程式啟動

當一個程式被執行的時候,所有的信號的裝填要麼是預設方式處理要麼是忽略信號。通常,信號被設置為它們的預設處理方法,除非調用exec的進程忽略了這個信號。詳細來說exec函數會將調用exec進程捕獲的信號的狀態更改為信號的預設處理方式而保留其他信號的處理方式,因為exec執行的新程式中不包含捕獲信號的函數地址,所以這些處理方式在新程式中是無意義的。

 

進程創建

當一個進程調用fork時,子進程繼承父進程的信號處理方式。在這裡,子進程是由父進程的記憶體鏡像的副本開始的,因此信號捕獲函數的地址是有意義的。

 

可重入函數

當一個信號一個進程的信號處理函數捕獲,此進程的正常指令執行順序會被此信號處理短暫的中斷,處理完信號後進程從之前被中斷的地方繼續執行。但是在信號處理函數中,我們是無法識別出當信號被捕獲是進程執行到了哪一步。如果當收到信號時進程正在通過malloc從堆上分配一塊額外的記憶體時,我們應該怎麼辦呢,在信號處理函數中調用malloc嗎?亦或是當收到某個信號時我們正在調用某個函數,比如getpwnam,這個函數將他的返回值存儲在一個靜態區域,這種情況下我們應該在信號處理函數中調用同樣的函數嗎?在上面malloc的情景中那樣做會對進程產生災難性的後果,因為malloc通常包含一個它所有分配過的區域的鏈接表,也許當時它正處於更新這個鏈接表的狀態中。在getpwnam的情境下,存儲在靜態區的getpwnam的返回值會被信號處理函數中的調用結果重寫!

因此, The Single UNIX Specification 要求信號處理函數中的函數調用必須是安全的,即可重入的(Reentrant functions)。這些函數被 The Single Unix Specification稱為非同步信號安全函數(async-signal safe)。除了可重入,他們會在函數運行期間阻塞任何會破壞連續性的信號的下達。非同步信號安全函數列表如下:

一些函數不被稱為非同步信號安全的原因大致如下:

  1. 使用了靜態數據結構
  2. 調用了malloc或free
  3. 屬於標準I/O庫的一部分

大多數標準I/O庫的實現使用了靜態數據結構,他們都不是可重入函數。需要特別註意的一點是:即使我們在信號處理函數中使用非同步信號安全的函數,每個線程下也僅僅只有一個errno變數(在多線程環境下,多個線程共用進程地址空間。每個線程需要它自己的errno副本以阻止線程間的相互干擾),而我們可能會潛在的修改掉errno的值。因此,有個通則:在信號處理函數中調用非同步信號安全函數前,應當保存errno。

 


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

-Advertisement-
Play Games
更多相關文章
  • SQL Server 使用兩個內部數據結構跟蹤被大容量複製操作修改的區,以及自上次完整備份後修改的區。這些數據結構極大地加快了差異備份的速度。當資料庫使用大容量日誌恢復模式時,這些數據結構也可以加快將大容量複製操作記錄至日誌的速度。與全局分配圖 (GAM) 和共用全局分配圖 (SGAM) 頁相同,這 ...
  • 摘要: 作為對垃圾游戲時代的致敬, Andreas Streichhardt 使用ArangoDB 資料庫創建了一個Flash 游戲來紀念這個時代。快來看看吧! ...
  • 版本: 主機:Windows 7 64位旗艦版 VMWare 10 + Windows 7 64位旗艦版 VMWare 10 + Ubuntu16.04LTS 64位 文件夾共用【Windows】: 註:先安裝VMWare Tools(如下拖拽(複製粘貼)【Windows】) 1)虛擬機採用橋接的網 ...
  • 好煩,又要寫摘要,主要是自己不會說些違心的話,又不願意發惱騷,但還是記錄一下自己目前的狀態和心情吧。生活內容很豐富但實際很平淡,除了親人帶給我一些驚喜外,我嗅不到任何新鮮了。我不知道自己價值多大,被認可的價值有多大,但我不能發惱騷,畢竟我是一個有內涵的程式猿。於是我想,是我不夠全面不夠自信不夠勇敢吧 ...
  • 本文目錄: 1.1 dd命令 1.2 split命令 1.3 csplit命令 在Linux最常用的文件生成和切片工具是dd,它功能比較全面,但無法以行為單位提取文件數據,也無法直接將文件按大小或行數進行均分(除非藉助迴圈)。另兩款數據分割工具split和csplit能夠比較輕鬆地實現這些需求。cs ...
  • uniq是去重,不相鄰的行不算重覆值。 uniq [OPTION]... [INPUT [OUTPUT]] 選項說明: -c:統計出現的次數(count)。 -d:只顯示被計算為重覆的行。 -D:顯示所有被計算為重覆的行。 -u:顯示唯一值,即沒有重覆值的行。 -i:忽略大小寫。 -z:在末尾使用\ ...
  • 本文目錄: 1.1 信號說明 1.2 trap佈置陷阱 1.3 佈置完美陷阱必備知識 家裡有老鼠,快消滅它!哎,又給跑了。老鼠這小東西跑那麼快,想直接直接消滅它還真不那麼容易。於是,老鼠藥、老鼠夾子或老鼠籠就派上用場了,它們都是陷阱,放在那靜靜地等待著老鼠的光顧。 在shell中,也可以捉"老鼠", ...
  • Linux Shell常用shell命令 一、文件、目錄操作命令 1、ls命令 功能:顯示文件和目錄的信息 ls 以預設方式顯示當前目錄文件列表 ls -a 顯示所有文件包括隱藏文件 ls -l 顯示文件屬性,包括大小,日期,符號連接,是否可讀寫及是否可執行 ls -lh 顯示文件的大小,以容易理解 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...