国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Linux > 正文

Linux信號處理1

2024-06-28 13:24:33
字體:
來源:轉載
供稿:網友
linux信號處理1函數原型
NAME       signal - ANSI C signal handlingSYNOPSIS       #include <signal.h>       typedef void (*sighandler_t)(int);       sighandler_t signal(int signum, sighandler_t handler);

signal函數具有注冊功能,什么事都不干。只是告訴系統,當來信號signum時,按handler的方式處理。只有來信號時,才會調用這個函數。信號不來,永遠不會調用這個函數。

用戶能夠通過輸入CTRL+c、Ctrl+/,或者是終端驅動程序分配給信號控制字符的其他任何鍵來請求內核產生信號。

ctrl + c --> 2)SIGINT ctrl + / --> 3)SIGQUIT

以上兩者都可以讓程序退出。

代碼
/*************************************************************************    > File Name: hello.c    > Author: KrisChou    > Mail:zhoujx0219@126.com     > Created Time: Mon 25 Aug 2014 09:25:15 AM CST ************************************************************************/#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <sys/stat.h>#include <sys/types.h>#include <fcntl.h>#include <assert.h>#include <signal.h>#include <sys/select.h>void handler(int num){    PRintf("sig_num: %d /n", num);}int main(int argc, char* argv[]){    char buf[1024];    signal(2, handler);    int iret ;    fd_set read_set, ready_set ;    FD_ZERO(&read_set);    FD_SET(0, &read_set);    while(1)    {        ready_set = read_set ;        iret = select(1, &ready_set, NULL, NULL, NULL);        if(iret == 0)        {            continue ;        }else if(iret == -1)        {            perror("select");            continue ;        }else         {            iret = read(0, buf, 1024);            buf[iret] = '/0';            write(1, buf, strlen(buf));        }    }

程序運行后先按ctrl+c,結果如下:

[purple@localhost review]$ gcc test.c[purple@localhost review]$ ./a.out^Csig_num: 2select: Interrupted system callhello world!hello world!

由于SIGINT已經通過signal(2, handler);進行注冊了, 因此很顯然當按下ctrl+c后,信號處理函數handler自然會捕捉到這個信號,因此會顯示^Csig_num: 2 。

而select函數 會處理中斷信號。收到中斷信號,會返回-1。 因此顯示select: Interrupted system call select 。

注意:select函數在3中情況下會返回,分別是:輪詢時間到點會返回。收到信號會返回。描述符有活動會返回。

(順帶補充下:read 是 阻塞函數,收到信號時先處理信號, 接著繼續等。)

之后程序運行就很顯然了。有輸入,select返回1,輸入什么,就打印什么。按ctrl+d,select返回0,程序繼續運行。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 龙胜| 黔东| 峨山| 民勤县| 米脂县| 思南县| 辽中县| 涿鹿县| 嵊泗县| 南昌县| 姚安县| 永济市| 新巴尔虎左旗| 新昌县| 望奎县| 昌黎县| 玉溪市| 会东县| 昆山市| 正安县| 廊坊市| 大余县| 普格县| 海丰县| 大同市| 高碑店市| 修武县| 禄丰县| 新邵县| 安达市| 光山县| 靖安县| 静乐县| 手游| 城步| 东源县| 新化县| 通道| 丹凤县| 买车| 镇赉县|