signal()函數

函數原型

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

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

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

或SIG_DFL要么SIG_IGN被設置為程序啟動時每個支持信號的默認信號處理行為。

參數:

SIG設置處理功能的信號值,以下宏常量表達式標識標準信號值:

?

信號

SIGABRT

(信號終止)異常終止,例如由…發起的退出功能

SIGFPE

(信號浮點異常)錯誤的算術運算,比如零分頻或導致溢出的運算(不一定是浮點運算)

SIGILL

(信號非法指令)無效的功能圖像,例如非法指令。這通常是由于代碼中的損壞或嘗試執行數據

SIGINT

(信號中斷)交互式注意信號。通常由應用程序用戶生成

SIGSEGV

(信號分段違規)對存儲的無效訪問:當程序試圖在已分配的內存之外讀取或寫入時。

SIGTERM

(信號終止)發送到程序的終止請求。

?

每個庫實現可以提供可以與此函數一起使用的附加信號值宏常量。

?

注意:并不是所有的運行環境都需要生成自動信號,即使在上述特定情況下也是如此,盡管所有運行環境都必須通過顯示調用生成的信號來生成提高功能

?

FUNC

指向函數的指針。這是程序員定義的函數,也可以是以下預定義函數之一:

SIG_DFL

默認處理:信號由該特定信號的默認操作處理

SIG_IGN

忽略信號:忽略信號

?

如果是一個函數,它應該遵循以下原型(使用C鏈接)

void handler_function(int parameter)

?

返回值

返回類型與參數func類型相同。

如果請求成功,則該函數返回指向特定處理函數的指針,該函數在調用 之前負責處理該信號(如果有的話)。或者SIG_DFL要么SIG_IGN。如果在調用之前信號由默認處理程序處理或被忽略,則相應的,如果該功能尚未能成功注冊新的信號處理程序,則返回SIG_ERR和錯誤號可以設置成正值。

?

/***
signal.c
***/#include<stdio.h>#include<signal.h>sig_atomic_t signaled = 0;void my_handler(int param){ signaled = 1;}int main(){void (*prev_handler)(int); prev_handler = signal(SIGINT,my_handler);raise(SIGINT);printf("signaled is %d.\n",signaled);}

運行結果:

root@ubuntu:/mnt/hgfs/ShareWindows/shiyanlou/C/Flappy_Bird# gcc signal.c -o signal

root@ubuntu:/mnt/hgfs/ShareWindows/shiyanlou/C/Flappy_Bird# ./signal

signaled is 1.

?

#include<stdio.h>
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum,sighandler_t handler);

第一個參數是要捕捉的信號(查看信號: kill –l , 9號SIGKILL信號不能被捕捉)

第二個參數表示我們要對信號進行的處理方式。

?

信號處理方式一般有三種:

1.忽略此信號(SIG_IGN):

/***
sig_ign.c
***/
#include<stdio.h>
#include<unistd.h>
#include<signal.h>int main()
{signal(2,SIG_IGN);while(1){printf("23333\n");sleep(1);}return 0;
}

執行程序會進入死循環,Ctrl+c進程不會停止,因為我們對Ctrl+c產生的2號SIGINT信號做了忽略處理,Ctrl+z(SIGQUIT)退出。

?

2.執行該信號的默認處理動作(SIG_DEL):

/***
sig_def.c
***/
#include<stdio.h>
#include<signal.h>
#include<unistd.h>int main()
{signal(2,SIG_DFL);while(1){printf("23333\n");sleep(1);}return 0;
}

執行程序時,對Ctrl+c設置的默認動作處理,此時ctrl+c就可以停止程序。

?

?3.提供一個信號處理函數,要求內核在處理該信號時切換到用戶態執行這個處理函數,這種方式稱為捕捉一個信號:

/***
sig_catch.c
***/
#include<stdio.h>
#include<signal.h>
#include<unistd.h>void handler(int signo)
{printf(" catch a signal:%d\n",signo);
}int main()
{signal(2,handler);while(1){printf("2333\n");sleep(1);}return 0;
}

運行結果:

?

?

此時按下ctrl+c會被捕捉到,不會中斷程序了。

?

一些常用的信號宏定義:

Signal

Description

SIGABRT

由調用abort函數產生,進程非正常退出

SIGALRM

由alarm函數設置的timer超時或setitimer函數設置的interval timer超時

SIGBUS

某種特定的硬件異常,通常由內存訪問引起

SIGCANCEL

由SOLARIS Thread Library內部使用,通常不會使用

SIGCHLD

進程Terminate或Stop的時候,SIGCHLD會發送給他的父進程。缺省情況下會該Signal會忽略

SIGCONT

當被stop的進程恢復運行的時候,自動發送

SIGEMT

和實現相關的硬件異常

SIGFPE

?數字相關的異常,如被0除,浮點溢出。

SIGFREEZE

Solaris專用,Hiberate或者Suspended時候發送。

SIGHUP

發送給具有Terminal的Controlling Process,當terminal被disconnect時候發送

SUGILL

非法指令異常

SIGINFO

BSD signal。由Status Key產生,通常是CTRL+T。發送給所有Foreground Group的進程

SIGINT

由Interrupt Key產生,通常是CTRL+C或DELETE。發送給所有的ForeGround FROUP的進程

SIGIO

異步IO事件

SIGIOT

實現相關的硬件異常,一般對應SIGABRT

SIGKILL

無法處理和忽略,中止某個程序

SIGLWP

由Solaris Thread Library內部使用

SIGPIPE

在reader終止之后寫Pipe的時候發送

SIGPOLL

當某個事件發送給Pollable Device的時候發送

SIGPROF

Setitimer指定的Profilling Interval Timer所產生

SIGPWR

和系統相關。和UPS相關

SIGQUIT

輸入Quit Key的時候,(CTRL + \)發送給所有的Foreground Group的進程

SIGSEGV

非法內存訪問

SIGSTKFLT

Linux專用,數學協處理器的棧異常

SIGSTOP

中止進程,無法處理和忽略

SIGSYS

非法系統調用

SIGTERM

請求中止進程,kill命令缺省發送

SIGTHAW

Solaris專用,從Suspend恢復時發送

SIGTRAP

實現相關的硬件異常,一般是調試異常

SIGTSTP

Suspend Key,一般是Ctrl+Z,發送給所有的ForeGround Group的進程

SIGTTIN

當BackGround Froup的進程嘗試讀取Terminal的時候發送

SIGTTOU

當Background Group的進程嘗試寫Terminal的時候發送

SIGURG

當out-of-band data接收的時候可能發送

SIGUSR1

用戶自定義signal 1

SIGUSR2

用戶自定義signal 2

SIGVTALRM

setitimer函數設置的Virual Interval Timer超時的時候

SIGTAITING

Solaris Thread Library內部實現專用

SIGWINCH

當Terminal的窗口大小改變的時候,發送給Foreground Group的所有進程

SIGXCPU

當CPU時間限制超時的時候

SIGXFSZ

進程超過文件大小限制

SIGXRES

Solaris專用,進程超過資源限制的時候發

?

轉載于:https://www.cnblogs.com/wanghao-boke/p/11577391.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/384819.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/384819.shtml
英文地址,請注明出處:http://en.pswp.cn/news/384819.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

setitimer()函數

定時器時間函數 struct itimerval&#xff1a;struct itimerval *new_value&#xff0c;其定義如下&#xff1a;struct itimerval {struct timeval it_interval; /*next value*/struct timeval it_value; /*current value*/};struct timeval {long tv_sec; /*seconds*/lonng t…

shell編程題(三)

將一目錄下所有的文件的擴展名改為bak #! /bin/bashfor i in ls domv $i ${i%%.*}.bak done ${i%%.*} 截掉一個變量字符串第一個"."以及其右側的所有字符&#xff0c;即最短前綴匹配。 #! /bin/bashdir./ #指定文件夾for file in $dir*.txt #指定文件夾下面文件類型…

VMware安裝VMwaretools

默認點擊“安裝VMware Tools&#xff08;T&#xff09;”選項下載好安裝包 下載的安裝包放在計算機的media目錄下 進入/media/ubuntu14-04/VMware Tools目錄&#xff1a; cd /media/ubuntu14-04/VMware Tools 將安裝包復制到tmp文件夾下&#xff1a; cp VMwareTools-10.0.5-322…

shell編程題(四)

編譯當前目錄下的所有.c文件 #!/bin/bashif [ $# -lt 1 ] ;then #如果輸入參數小于1則報錯 $# C語言中的argv[0] 輸入參數個數echo "Please follow up file.c!"echo "eg: ./make.sh xxx.c"exit fiif [[ $2 "debug" ]] ;then #如果第三個參數…

stat函數

int lstat(const char *path,struct stat*buf) 當文件是一個符號鏈接時&#xff0c;lstat返回的是該符號鏈接本身的信息&#xff0c;而stat返回的是該鏈接指向的文件的信息。 struct stat {dev_t st_dev; //設備號碼ino_t st_ino; //inode節點號mo…

字符串函數參數傳入傳出(字符串反轉)

/*** strstr.c ***/ #include<stdio.h> #include<string.h>//求字符串p中abcd出現的次數 //自定義函數接口完成業務函數和main函數分開 int getCount(char *mystr,char *sub,int *ncount) {int ret 0;if(mystr NULL || sub NULL || ncount NULL){ret -1;print…

字符串函數參數傳入傳出(去空格)

字符串作為函數參數傳入傳出 /*** delSpace.c ***/ #include<stdio.h> #include<string.h>int DelSpace(char *str) {int iRet -1;int i ;int j ;int ncount 0;char *out str;if(NULL str ){printf("the point in is NULL\n");return iRet;}i 0;j …

字符串的規范使用

有一個字符串”1a2b3d4z”,&#xff1b; 要求寫一個函數實現如下功能&#xff0c; 功能1&#xff1a;把偶數位字符挑選出來&#xff0c;組成一個字符串1。valude&#xff1b;20分 功能2&#xff1a;把奇數位字符挑選出來&#xff0c;組成一個字符串2&#xff0c;valude 20 功能…

字符串的規范使用(二)

鍵值對&#xff08;”key valude”&#xff09;字符串&#xff0c;在開發中經常使用&#xff1b; 要求1&#xff1a;請自己定義一個接口&#xff0c;實現根據key獲取valude&#xff1b;40分 要求2&#xff1a;編寫測試用例。30分 要求3&#xff1a;鍵值對中間可能有n多空格&am…

字符串逆序打印

版本1 兩個指針從頭到尾和從尾到頭交換內容逆序 /*** str_reverse.c ***/ #include<stdio.h> #include<string.h>int main() {char buf[] "abcdrfg";int len strlen(buf);char *p1 buf;char *p2 buf len - 1;while(p1 < p2){char c *p1;*p1 *p…

realloc()函數

原型&#xff1a;extern void *realloc(void *mem_address, unsigned int newsize); 參數&#xff1a; mem_address&#xff1a; 要改變內存大小的指針名newsize &#xff1a; 新的內存大小。 如果分配內存減少&#xff0c;realloc僅僅改變索引的信息。 如果將…

fgets()函數

聲明&#xff1a;  char *fgets(char *str&#xff0c;int n,FILE* stream) 參數&#xff1a;  str—這是指向一個字符數組的指針&#xff0c;該數組存儲了要讀取的字符串 n – 這是要讀取的最大字符數&#xff08;包括最后的空字符&#xff09;。通常是使用以str傳遞的數組…

C語言實現文件類型統計函數

#include<dirent.h> #include<limits.h> #include<sys/stat.h> #include<stdio.h> #include<unistd.h> #include<stdlib.h> #include<string.h>#define FTW_F 1 //標記非目錄文件 #define FTW_D 2 //標…

C語言實現多線程排序

#include <stdio.h> #include <pthread.h> #include <stdlib.h> #include <string.h>/* 聲明變量 */ int array_length, file_length; int *array_master; FILE *freader;/* 用于從文件讀取數據 */ int *read_file(char *fname) {freader fopen(fnam…

linux線程操作

初始化條件變量 int pthread_cond_init(pthread_cond_t *cv,pthread_cond_attr *cattr); 函數返回值&#xff1a;返回0表示成功&#xff0c;返回其他表示失敗。 參數&#xff1a; pthread_cond_attr是用來設置pthread_cond_t的屬性&#xff0c;當傳入的值是NULL的時候表…

Linux下多線程模擬停車場停車

#include<stdio.h> #include<string.h> #include<unistd.h> #include<stdlib.h> #include<pthread.h>#define ONE_SECOND 1000000 #define RANGE 10 #define PERIOD 2 #define NUM_THREADS 4typedef struct {int *carpark; //用一個數組來模…

【C++學習之路】第一章——C++核心方法總論

1 C核心方法總論 1.1 核心思想 通過實際項目來學習編程&#xff0c;更高效掌握編程規則&#xff0c;以及明白各種語法規則的實際應用。 實驗思想&#xff1a;任何C的參考資料都不可能覆蓋你遇到的所有問題&#xff0c;這個時候&#xff0c;最好的辦法就是&#xff0c;編輯代…

【Verilog HDL學習之路】第一章 Verilog HDL 數字設計總論

1 Verilog HDL 數字設計總論 1.1 幾個重要的概念 EDA&#xff08;Electronic Design Automation&#xff09; 電子技術自動化 EDA工具 類似于軟件工程中的IDE&#xff08;集成開發環境&#xff09;&#xff0c;能夠使用Verilog HDL語言描述電路設計&#xff0c;并且能夠通過邏…

【學會如何學習系列】從嬰兒到大學——學習的本質從未改變過

從嬰兒到大學——學習的本質從未改變過 從我們出生一直到現在&#xff0c;其實&#xff0c;學習的本質從來都沒有改變過&#xff0c;并且&#xff0c;嬰兒時期的我們&#xff0c;是學習能力最強的時候&#xff0c;隨著我們不斷長大&#xff0c;外界的誘惑越來越多&#xff0c;…

【匯編語言學習之路】第一章 匯編語言核心方法論

版權聲明&#xff1a;本學習筆記是本人根據小甲魚“匯編語言學習課程”和《匯編語言》&#xff08;王爽&#xff09;的書籍&#xff0c;來記錄筆記的 1 匯編語言核心方法論 1.1 學習匯編語言的必要性 匯編語言與機器語言是一一對應關系&#xff0c;它的本質是機器語言的代號。…