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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C语言关于signal()函数

發布時間:2025/3/20 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言关于signal()函数 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

函數原型

void(* signal(int sig,void(* func)(int)))(int;

指定使用sig指定的信號編號處理信號的方法。 參數func指定程序可以處理信號的三種方式之一:

默認處理(SIG_DFL):信號由該特定信號的默認動作處理。
忽略信號(SIG_IGN):忽略信號,即使沒有意義,代碼執行仍將繼續。
函數處理程序:定義一個特定的函數來處理信號。

常用的 sig 參數

常用的FUNC()參數

例子

signal(SIGSEGV, SIG_IGN);

程序定義了一個信號量,當出現這個信號量(非法內存訪問)的時候,會執行SIG_IGN

即當我們非法內存訪問的時候,會忽略此信號

2. 有時候Func這個參數 也可以是我們自定義的參數

signal(11, sigsegv_handler);

這里的11也代指 SIGSEGV

sigsegv_handler函數我們定義為:

程序定義了一個信號量,當出現這個信號量(非法內存訪問)的時候,會執行sigsegv_handler函數

即當我們非法內存訪問的時候,會將我們的flag通過標準錯誤打印出來(fflush(stderr))

不同的信號可以用字母代替,也可以用數字代替,具體為

  • SIGHUP
    本信號在用戶終端連接(正常或非正常)結束時發出, 通常是在終端的控制進程結束時, 通知同一session內的各個作業, 這時它們與控制終端不再關聯。
  • 登錄Linux時,系統會分配給登錄用戶一個終端(Session)。在這個終端運行的所有程序,包括前臺進程組和后臺進程組,一般都屬于這個 Session。當用戶退出Linux登錄時,前臺進程組和后臺有對終端輸出的進程將會收到SIGHUP信號。這個信號的默認操作為終止進程,因此前臺進 程組和后臺有終端輸出的進程就會中止。不過可以捕獲這個信號,比如wget能捕獲SIGHUP信號,并忽略它,這樣就算退出了Linux登錄,wget也 能繼續下載。

    此外,對于與終端脫離關系的守護進程,這個信號用于通知它重新讀取配置文件。

  • SIGINT
    程序終止(interrupt)信號, 在用戶鍵入INTR字符(通常是Ctrl-C)時發出,用于通知前臺進程組終止進程。

  • SIGQUIT
    和SIGINT類似, 但由QUIT字符(通常是Ctrl-)來控制. 進程在因收到SIGQUIT退出時會產生core文件, 在這個意義上類似于一個程序錯誤信號。

  • SIGILL
    執行了非法指令. 通常是因為可執行文件本身出現錯誤, 或者試圖執行數據段. 堆棧溢出時也有可能產生這個信號。

  • SIGTRAP
    由斷點指令或其它trap指令產生. 由debugger使用。

  • SIGABRT
    調用abort函數生成的信號。

  • SIGBUS
    非法地址, 包括內存地址對齊(alignment)出錯。比如訪問一個四個字長的整數, 但其地址不是4的倍數。它與SIGSEGV的區別在于后者是由于對合法存儲地址的非法訪問觸發的(如訪問不屬于自己存儲空間或只讀存儲空間)。

  • SIGFPE
    在發生致命的算術運算錯誤時發出. 不僅包括浮點運算錯誤, 還包括溢出及除數為0等其它所有的算術的錯誤。

  • SIGKILL
    用來立即結束程序的運行. 本信號不能被阻塞、處理和忽略。如果管理員發現某個進程終止不了,可嘗試發送這個信號。

  • SIGUSR1
    留給用戶使用

  • SIGSEGV
    試圖訪問未分配給自己的內存, 或試圖往沒有寫權限的內存地址寫數據.

  • SIGUSR2
    留給用戶使用

  • SIGPIPE
    管道破裂。這個信號通常在進程間通信產生,比如采用FIFO(管道)通信的兩個進程,讀管道沒打開或者意外終止就往管道寫,寫進程會收到SIGPIPE信號。此外用Socket通信的兩個進程,寫進程在寫Socket的時候,讀進程已經終止。

  • SIGALRM
    時鐘定時信號, 計算的是實際的時間或時鐘時間. alarm函數使用該信號.

  • SIGTERM
    程序結束(terminate)信號, 與SIGKILL不同的是該信號可以被阻塞和處理。通常用來要求程序自己正常退出,shell命令kill缺省產生這個信號。如果進程終止不了,我們才會嘗試SIGKILL。

  • SIGCHLD
    子進程結束時, 父進程會收到這個信號。

  • 如果父進程沒有處理這個信號,也沒有等待(wait)子進程,子進程雖然終止,但是還會在內核進程表中占有表項,這時的子進程稱為僵尸進程。這種情 況我們應該避免(父進程或者忽略SIGCHILD信號,或者捕捉它,或者wait它派生的子進程,或者父進程先終止,這時子進程的終止自動由init進程 來接管)。

  • SIGCONT
    讓一個停止(stopped)的進程繼續執行. 本信號不能被阻塞. 可以用一個handler來讓程序在由stopped狀態變為繼續執行時完成特定的工作. 例如, 重新顯示提示符

  • SIGSTOP
    停止(stopped)進程的執行. 注意它和terminate以及interrupt的區別:該進程還未結束, 只是暫停執行. 本信號不能被阻塞, 處理或忽略.

  • SIGTSTP
    停止進程的運行, 但該信號可以被處理和忽略. 用戶鍵入SUSP字符時(通常是Ctrl-Z)發出這個信號

  • SIGTTIN
    當后臺作業要從用戶終端讀數據時, 該作業中的所有進程會收到SIGTTIN信號. 缺省時這些進程會停止執行.

  • SIGTTOU
    類似于SIGTTIN, 但在寫終端(或修改終端模式)時收到.

  • SIGURG
    有”緊急”數據或out-of-band數據到達socket時產生.

  • SIGXCPU
    超過CPU時間資源限制. 這個限制可以由getrlimit/setrlimit來讀取/改變。

  • SIGXFSZ
    當進程企圖擴大文件以至于超過文件大小資源限制。

  • SIGVTALRM
    虛擬時鐘信號. 類似于SIGALRM, 但是計算的是該進程占用的CPU時間.

  • SIGPROF
    類似于SIGALRM/SIGVTALRM, 但包括該進程用的CPU時間以及系統調用的時間.

  • SIGWINCH
    窗口大小改變時發出.

  • SIGIO
    文件描述符準備就緒, 可以開始進行輸入/輸出操作.

  • SIGPWR
    Power failure

  • SIGSYS
    非法的系統調用。

  • 在以上列出的信號中,程序不可捕獲、阻塞或忽略的信號有:SIGKILL,SIGSTOP
    不能恢復至默認動作的信號有:SIGILL,SIGTRAP
    默認會導致進程流產的信號有:SIGABRT,SIGBUS,SIGFPE,SIGILL,SIGIOT,SIGQUIT,SIGSEGV,SIGTRAP,SIGXCPU,SIGXFSZ
    默認會導致進程退出的信號有:SIGALRM,SIGHUP,SIGINT,SIGKILL,SIGPIPE,SIGPOLL,SIGPROF,SIGSYS,SIGTERM,SIGUSR1,SIGUSR2,SIGVTALRM
    默認會導致進程停止的信號有:SIGSTOP,SIGTSTP,SIGTTIN,SIGTTOU
    默認進程忽略的信號有:SIGCHLD,SIGPWR,SIGURG,SIGWINCH

    此外,SIGIO在SVR4是退出,在4.3BSD中是忽略;SIGCONT在進程掛起時是繼續,否則是忽略,不能被阻塞。

    以下是其它網友的補充:

    SIGHUP 終止進程 終端線路掛斷
    SIGINT 終止進程 中斷進程
    SIGQUIT 建立CORE文件終止進程,并且生成core文件
    SIGILL 建立CORE文件 非法指令
    SIGTRAP 建立CORE文件 跟蹤自陷
    SIGBUS 建立CORE文件 總線錯誤
    SIGSEGV 建立CORE文件 段非法錯誤
    SIGFPE 建立CORE文件 浮點異常
    SIGIOT 建立CORE文件 執行I/O自陷
    SIGKILL 終止進程 殺死進程
    SIGPIPE 終止進程 向一個沒有讀進程的管道寫數據
    SIGALARM 終止進程 計時器到時
    SIGTERM 終止進程 軟件終止信號
    SIGSTOP 停止進程 非終端來的停止信號
    SIGTSTP 停止進程 終端來的停止信號
    SIGCONT 忽略信號 繼續執行一個停止的進程
    SIGURG 忽略信號 I/O緊急信號
    SIGIO 忽略信號 描述符上可以進行I/O
    SIGCHLD 忽略信號 當子進程停止或退出時通知父進程
    SIGTTOU 停止進程 后臺進程寫終端
    SIGTTIN 停止進程 后臺進程讀終端
    SIGXGPU 終止進程 CPU時限超時
    SIGXFSZ 終止進程 文件長度過長
    SIGWINCH 忽略信號 窗口大小發生變化
    SIGPROF 終止進程 統計分布圖用計時器到時
    SIGUSR1 終止進程 用戶定義信號1
    SIGUSR2 終止進程 用戶定義信號2
    SIGVTALRM 終止進程 虛擬計時器到時

  • SIGHUP 本信號在用戶終端連接(正常或非正常)結束時發出, 通常是在終端的控
    制進程結束時, 通知同一session內的各個作業, 這時它們與控制終端
    不再關聯.
  • SIGINT 程序終止(interrupt)信號, 在用戶鍵入INTR字符(通常是Ctrl-C)時發出
  • SIGQUIT 和SIGINT類似, 但由QUIT字符(通常是Ctrl-)來控制. 進程在因收到
    SIGQUIT退出時會產生core文件, 在這個意義上類似于一個程序錯誤信
    號.
  • SIGILL 執行了非法指令. 通常是因為可執行文件本身出現錯誤, 或者試圖執行
    數據段. 堆棧溢出時也有可能產生這個信號.
  • SIGTRAP 由斷點指令或其它trap指令產生. 由debugger使用.
  • SIGABRT 程序自己發現錯誤并調用abort時產生.
  • SIGIOT 在PDP-11上由iot指令產生, 在其它機器上和SIGABRT一樣.
  • SIGBUS 非法地址, 包括內存地址對齊(alignment)出錯. eg: 訪問一個四個字長
    的整數, 但其地址不是4的倍數.
  • SIGFPE 在發生致命的算術運算錯誤時發出. 不僅包括浮點運算錯誤, 還包括溢
    出及除數為0等其它所有的算術的錯誤.
  • SIGKILL 用來立即結束程序的運行. 本信號不能被阻塞, 處理和忽略.
  • SIGUSR1 留給用戶使用
  • SIGSEGV 試圖訪問未分配給自己的內存, 或試圖往沒有寫權限的內存地址寫數據.
  • SIGUSR2 留給用戶使用
  • SIGPIPE Broken pipe
  • SIGALRM 時鐘定時信號, 計算的是實際的時間或時鐘時間. alarm函數使用該
    信號.
  • SIGTERM 程序結束(terminate)信號, 與SIGKILL不同的是該信號可以被阻塞和
    處理. 通常用來要求程序自己正常退出. shell命令kill缺省產生這
    個信號.
  • SIGCHLD 子進程結束時, 父進程會收到這個信號.
  • SIGCONT 讓一個停止(stopped)的進程繼續執行. 本信號不能被阻塞. 可以用
    一個handler來讓程序在由stopped狀態變為繼續執行時完成特定的
    工作. 例如, 重新顯示提示符
  • SIGSTOP 停止(stopped)進程的執行. 注意它和terminate以及interrupt的區別:
    該進程還未結束, 只是暫停執行. 本信號不能被阻塞, 處理或忽略.
  • SIGTSTP 停止進程的運行, 但該信號可以被處理和忽略. 用戶鍵入SUSP字符時
    (通常是Ctrl-Z)發出這個信號
  • SIGTTIN 當后臺作業要從用戶終端讀數據時, 該作業中的所有進程會收到SIGTTIN
    信號. 缺省時這些進程會停止執行.
  • SIGTTOU 類似于SIGTTIN, 但在寫終端(或修改終端模式)時收到.
  • SIGURG 有"緊急"數據或out-of-band數據到達socket時產生.
  • SIGXCPU 超過CPU時間資源限制. 這個限制可以由getrlimit/setrlimit來讀取/
    改變
  • SIGXFSZ 超過文件大小資源限制.
  • SIGVTALRM 虛擬時鐘信號. 類似于SIGALRM, 但是計算的是該進程占用的CPU時間.
  • SIGPROF 類似于SIGALRM/SIGVTALRM, 但包括該進程用的CPU時間以及系統調用的
    時間.
  • SIGWINCH 窗口大小改變時發出.
  • SIGIO 文件描述符準備就緒, 可以開始進行輸入/輸出操作.
  • SIGPWR Power failure
  • 有 兩個信號可以停止進程:SIGTERM和SIGKILL。 SIGTERM比較友好,進程能捕捉這個信號,根據您的需要來關閉程序。在關閉程序之前,您可以結束打開的記錄文件和完成正在做的任務。在某些情況下,假 如進程正在進行作業而且不能中斷,那么進程可以忽略這個SIGTERM信號。

    對于SIGKILL信號,進程是不能忽略的。這是一個 “我不管您在做什么,立刻停止”的信號。假如您發送SIGKILL信號給進程,Linux就將進程停止在那里。

    總結

    以上是生活随笔為你收集整理的C语言关于signal()函数的全部內容,希望文章能夠幫你解決所遇到的問題。

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

    主站蜘蛛池模板: 成人在线国产精品 | 国产巨乳在线观看 | 日韩特黄 | 欧美影院一区二区三区 | 国产精品成人无码免费 | 国产午夜一区二区 | 成人国产在线 | 欧美亚洲一级片 | 亚洲自啪 | 一级特黄妇女高潮2 | 大尺度摸揉捏胸床戏视频 | 野外一级片 | 亚洲色视频 | 日本免费不卡一区二区 | 亚洲精品无码久久久久久久 | 双性人bbww欧美双性 | 日韩在线电影一区 | hd丰满圆润的女人hd | 亚洲成人免费在线视频 | 欧美色精品在线 | 五月亚洲| 日本女人性视频 | 中文字幕第18页 | 亚欧美一区二区三区 | 亚洲精品中文字幕在线观看 | 国产精品白虎 | 国产传媒av| 五月综合激情日本mⅴ | 久久久久a | 爱爱免费视频网站 | 国产叼嘿视频在线观看 | 欧美大片aaa | 福利网站在线观看 | 欧美三级欧美一级 | 日韩免费观看一区二区三区 | 男生操女生屁股 | 日韩www | 蜜桃av噜噜一区二区三区网址 | 欧美成人h版 | 亚洲视频免费在线 | 亚洲精品a | 亚洲女人视频 | 亚洲精品无amm毛片 国内一区二区三区 | 男女免费视频网站 | 国产97在线 | 亚洲 | 精品影片一区二区入口 | 国产女人18毛片水18精品 | 九色在线观看 | 亚洲精品电影在线观看 | 一级成人黄色片 | 嫩草影院一区二区三区 | 亚洲天堂手机在线观看 | 国产小视频网站 | 国产日产精品一区二区三区四区 | av午夜在线观看 | 久久九九久久九九 | 无码精品视频一区二区三区 | 看黄色一级| 精品综合久久 | 国产精品日日摸夜夜爽 | 深夜视频在线播放 | 亚洲黄色在线视频 | 伊人天堂网| 国产91免费观看 | 亚洲精品专区 | 久久爱综合| 国产一级淫片a视频免费观看 | 成人在线观看免费高清 | 快播视频在线观看 | 久久亚洲av无码精品色午夜麻豆 | 靠逼动漫 | 成人网在线播放 | 欧美综合社区 | 女人18毛片毛片毛片毛片区二 | 成人黄色网 | 在线观看jizz | 国产高清色 | 国产乱了高清露脸对白 | 欧美两根一起进3p做受视频 | 日韩欧美一区二 | 99热只有这里有精品 | 国产网站黄色 | 国产区123| 夜操操 | 久久爱影视i | 免费看的毛片 | 1000部拍拍拍18勿入免费视频 | 精品少妇人妻AV无码专区在线 | 中国黄色一级视频 | 狠狠老司机| 无码人妻aⅴ一区二区三区 国产高清一区二区三区四区 | 欧洲av一区二区三区 | 国产123区 | 一色屋免费视频 | 国产不卡免费视频 | 手机在线毛片 | 在线观看欧美精品 | 亚洲天堂男 | 午夜视频欧美 |