linux下基于C語言的信號(hào)編程實(shí)例
本文實(shí)例講述了linux下基于C語言的信號(hào)編程方法。分享給大家供大家參考。具體如下:
#include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <unistd.h> #include <signal.h> void sig_handler(int sig_no, siginfo_t *info, void *ctext){ printf("receive sig_no=%d\n",sig_no); if(sig_no == SIGQUIT){ printf("haha,想退出了嗎?"); }else{ printf("si_signo=%d\n",info->si_signo); printf("si_code =%d\n",info->si_code); printf("si_pid =%d\n",info->si_pid); printf("si_uid =%d\n",info->si_uid); printf("si_status=%d\n",info->si_status); printf("si_utime =%lld\n",info->si_utime); printf("si_stime =%lld\n",info->si_stime); printf("si_value =%d\n",info->si_value); printf("si_addr =0x%x\n",info->si_addr); printf("si_fd =%d\n",info->si_fd); } return ; } /*--------------------常用信號(hào)列表----------------------------*/ //SIGINT ctrl+c //SIGQUIT ctrl+\ //SIGPIPE 管道破裂 //SIGKILL 進(jìn)程終止,不能被捕獲 //SIGHUP shell退出 //SIGCHLD 子進(jìn)程終止信號(hào) //SIGFPE 浮點(diǎn)數(shù)異常(除以0之類的) //SIGTERM 終止信號(hào)(kill pid) int main(int argc ,char **argv){ struct sigaction sa; sa.sa_flags = 0; sa.sa_sigaction = sig_handler; sa.sa_flags |= SA_SIGINFO; //使用sa_sigaction作為回調(diào) //sa.sa_flags |= SA_RESETHAND; //處理函數(shù)只會(huì)被調(diào)用一次,之后被重置 //sa.sa_flags |= SA_NOCLDSTOP; //如果安裝了SIGCLD,子進(jìn)程不是正常退出,而是被kill掉了,則不會(huì)通知 //sa.sa_flags |= SA_NODEFER ; //使對(duì)信號(hào)的屏蔽無效,即在信號(hào)處理函數(shù)執(zhí)行期間仍能發(fā)出這個(gè)信號(hào) //sa.sa_flags |= SA_RESTART ; //使被信號(hào)打斷的系統(tǒng)調(diào)用自動(dòng)重新發(fā)起 //sa.sa_flags |= SA_NOCLDWAIT; //使父進(jìn)程在它的子進(jìn)程退出時(shí)不會(huì)收到 SIGCHLD 信號(hào),這時(shí)子進(jìn)程如果退出也不會(huì)成為僵尸進(jìn)程 //安裝信號(hào) if(sigaction(SIGINT,&sa,NULL)==-1) printf("安裝信號(hào)失敗\n"); if(sigaction(SIGQUIT,&sa,NULL)==-1) printf("安裝信號(hào)失敗\n"); while(1){ sleep(1); } return 0; } /*--------------------------信號(hào)編程相關(guān)結(jié)構(gòu)體----------------------------------*/ // struct sigaction { // void (*sa_handler)(int); // void (*sa_sigaction)(int, siginfo_t *, void *); // sigset_t sa_mask; // int sa_flags; // void (*sa_restorer)(void); // } // siginfo_t { // int si_signo; /* Signal number */ // int si_errno; /* An errno value */ // int si_code; /* Signal code */ // pid_t si_pid; /* Sending process ID */ // uid_t si_uid; /* Real user ID of sending process */ // int si_status; /* Exit value or signal */ // clock_t si_utime; //User time consumed // clock_t si_stime; /* System time consumed */ // sigval_t si_value; /* Signal value */ // int si_int; /* POSIX.1b signal */ // void * si_ptr; /* POSIX.1b signal */ // void * si_addr; /* Memory location which caused fault */ // int si_band; /* Band event */ // int si_fd; /* File descriptor */ // } // 信號(hào) 值 動(dòng)作 解釋 // SIGHUP 1 終端線路掛斷 // SIGINT 2 Term 鍵盤輸入的中斷命令,從終端輸入 Ctrl-C 時(shí)發(fā)生 // SIGQUIT 3 Core 鍵盤輸入的退出命令 // SIGILL 4 Core 錯(cuò)誤指令 // SIGABRT 6 Core abort(3)發(fā)出的中止信號(hào) // SIGFPE 8 Core 浮點(diǎn)數(shù)異常 // SIGKILL 9 Term KILL信號(hào) // SIGSEGV 11 Core 非法內(nèi)存訪問 // SIGPIPE 13 Term 管道斷開 // SIGALRM 14 Term alarm(2)發(fā)出的中止信號(hào) // SIGTERM 15 Term 強(qiáng)制中止信號(hào) // SIGUSR1 30,10,16 Term 用戶自定義信號(hào)1 // SIGUSR2 31,12,17 Term 用戶自定義信號(hào)2 // SIGCHLD 20,17,18 Ign 子進(jìn)程中止信號(hào) // SIGCONT 19,18,25 Cont 繼續(xù)執(zhí)行一個(gè)停止的進(jìn)程 // SIGSTOP 17,19,23 Stop 非終端來的停止信號(hào) // SIGTSTP 18,20,24 Stop 終端來的停止信號(hào) // SIGTTIN 21,21,26 Stop 后臺(tái)進(jìn)程讀終端 // SIGTTOU 22,22,27 Stop 后臺(tái)進(jìn)程寫終端
希望本文所述對(duì)大家的C語言程序設(shè)計(jì)有所幫助。
相關(guān)文章
C語言數(shù)據(jù)結(jié)構(gòu)詳細(xì)解析二叉樹的操作
二叉樹可以簡(jiǎn)單理解為對(duì)于一個(gè)節(jié)點(diǎn)來說,最多擁有一個(gè)上級(jí)節(jié)點(diǎn),同時(shí)最多具備左右兩個(gè)下級(jí)節(jié)點(diǎn)的數(shù)據(jù)結(jié)構(gòu)。本文將詳細(xì)介紹一下C++中二叉樹的實(shí)現(xiàn)和遍歷,需要的可以參考一下2022-04-04C++中回調(diào)函數(shù)及函數(shù)指針的實(shí)例詳解
這篇文章主要介紹了C++中回調(diào)函數(shù)及函數(shù)指針的實(shí)例詳解的相關(guān)資料,希望通過本文能幫助到大家,讓大家理解掌握這部分內(nèi)容,需要的朋友可以參考下2017-10-10C語言實(shí)現(xiàn)隨機(jī)發(fā)撲克牌
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)隨機(jī)發(fā)撲克牌,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-04-04C++有符號(hào)和無符號(hào)之間的轉(zhuǎn)換問題
在開發(fā)中經(jīng)常會(huì)遇到有符號(hào)和無符號(hào)之間的轉(zhuǎn)換問題,如果不清楚問題根源,很難解決bug,今天小編通過本文給大家分享c++有符號(hào)無符號(hào)轉(zhuǎn)換問題,需要的朋友參考下2021-07-07VC實(shí)現(xiàn)圖片拖拽及動(dòng)畫的實(shí)例
這篇文章介紹了VC實(shí)現(xiàn)圖片拖拽及動(dòng)畫的實(shí)例,有需要的朋友可以參考一下2013-08-08C++實(shí)現(xiàn)LeetCode(642.設(shè)計(jì)搜索自動(dòng)補(bǔ)全系統(tǒng))
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(642.設(shè)計(jì)搜索自動(dòng)補(bǔ)全系統(tǒng)),本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08使用用C++做一顆會(huì)跳動(dòng)的愛心實(shí)例代碼
大家好,本篇文章主要講的是使用用C++做一顆會(huì)跳動(dòng)的愛心實(shí)例代碼,感興趣的同學(xué)趕快來看一看吧,歡迎借鑒學(xué)習(xí)C++做一顆會(huì)跳動(dòng)的愛心實(shí)例代碼2021-12-12