久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

linux中的信號機制

 魅影蒼穹 2017-12-01

  

  • 概述
  Linux信號機制是在應用軟件層次上對中斷機制的一種模擬,信號提供了一種處理異步事件的方法,,例如,終端用戶輸入中斷鍵(ctrl+c),,則會通過信號機制停止一個程序[1],。
  這其實就是向那個程序(進程)發(fā)送一個SIGINT信號。每個進程都有一個自己私有的信號處理函數(shù)映射表,當該進程成收到一個信號時,,對應的信號處理函數(shù)被觸發(fā)執(zhí)行,。而一個進程可以向另外一個進程發(fā)送信號,也可以向自己發(fā)送信號,;操作系統(tǒng)內核也可以向一個進程發(fā)送信號,,以通知某些硬件事件。信號處理函數(shù)映射表中共有64個表項,。前32個信號,,編號為1 ~ 31,有預定義的含義和處理函數(shù),;后32個作為擴充[2],。在終端輸入命令“kill -l”就可以看到系統(tǒng)所支持所有的信號。
  • 信號機制的兩個常用函數(shù)

  

    signal

#include <signal.h>
void (*signal(int signo, void (*func)(int)))(int);

返回值:若成功則返回信號以前的處理配置,,如果出差則返回SIG_ERR,;
或者用如下的定義:

typedef void (*sighandler_t)(int);
sighandler_t signal(int signo, sighandler_t handler);

這個函數(shù)的功能是捕捉到相應的信號(signo),并用相應的處理函數(shù)(func/handler)來對信號進行相應的相應,,是會替代原來的處理函數(shù),。但是要和足以,SIGKILL和SIGSTOP這兩個信號是既不能被捕捉也不能被忽略的?。ó敃r我們做一個后臺程序,,我還想用捕捉SIGKILL的方式來免殺呢)。

  KILL

#include<signal.h>
int kill(pid_t pid, int sig);


這個函數(shù)的功能是將信號發(fā)送給進程或者進程組,。

pid > 0  :要發(fā)送信號的進程號

pid = 0  :信號被發(fā)送到所以和當前進程在同一個進程組的進程

pid = -1 : 信號發(fā)送給發(fā)送進程有權限向他們發(fā)送信號的系統(tǒng)上的所以進程

pid < -1 :信號發(fā)送給其進程組ID等于pid的絕對值

  • 幾個比較常用的信號

SIGIGN:忽略改信號

SIGDEF:采用系統(tǒng)默認方式處理信號

SIGCHLD:在一個進程終止或者停止時,,將該信號發(fā)送給其父進程,父進程的wait函數(shù)通常用來捕捉這個信號

SIGINT:當用戶按中斷鍵(delete/ctrl+c)時將產生這個信號

SIGKILL:此信號可以用于殺死一個進程

SIGSTOP:這是個作業(yè)控制信號,,用于停止一個進程   這個信號和SIGKILL是僅有的兩個不能被捕獲或忽略的信號

SYSUSR1/2:用戶定義的信號,,用于應用程序

  • 程序演示

 

 

復制代碼
/*************************************************************************
    > File Name: signal.c
    > Author: he xingjie
    > Mail: [email protected] 
    > Created Time: Fri 25 Oct 2013 07:53:56 AM PDT
 ************************************************************************/

#include<stdio.h>
#include<stdlib.h>
#include<signal.h>

void my_func(int sig_no){
    if(sig_no == SIGUSR1)
        printf("Receive SIGUSR1.\n");
    if(sig_no == SIGUSR2)
        printf("Receive SIGUSR2.\n");
    if(sig_no == SIGINT)
        printf("Receive SIGINT.\n"); 
}

int main(void)
{
    if(signal(SIGUSR1, my_func) == SIG_ERR)
        printf("can't catch SIGUSR1.\n'");
    if(signal(SIGUSR2, my_func) == SIG_ERR)
        printf("can't catch SIGUSR2.\n'");
    if(signal(SIGINT, my_func) == SIG_ERR)
        printf("can't catch SIGINT.\n'");

    kill(getpid(),SIGINT);

    while(1);
    return 0;
}
復制代碼

當運行這個程序的時候,我們將會看到:Receive SIGINT.  然后程序不斷在循環(huán),,如果我們按ctrl+c,,將會輸出:Receive SIGINT.

如果我們把程序放在后天運行,并且用 kill -USR1 pid,。pid為那個進程的id,,我們還將會看到Receive SIGUSR1.

  • 參考資料

  [1] UNIX環(huán)境高級編程

  [2]  我們老師上課的課件

 

    本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發(fā)布,,不代表本站觀點,。請注意甄別內容中的聯(lián)系方式、誘導購買等信息,,謹防詐騙,。如發(fā)現(xiàn)有害或侵權內容,,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多