黄色网页视频 I 影音先锋日日狠狠久久 I 秋霞午夜毛片 I 秋霞一二三区 I 国产成人片无码视频 I 国产 精品 自在自线 I av免费观看网站 I 日本精品久久久久中文字幕5 I 91看视频 I 看全色黄大色黄女片18 I 精品不卡一区 I 亚洲最新精品 I 欧美 激情 在线 I 人妻少妇精品久久 I 国产99视频精品免费专区 I 欧美影院 I 欧美精品在欧美一区二区少妇 I av大片网站 I 国产精品黄色片 I 888久久 I 狠狠干最新 I 看看黄色一级片 I 黄色精品久久 I 三级av在线 I 69色综合 I 国产日韩欧美91 I 亚洲精品偷拍 I 激情小说亚洲图片 I 久久国产视频精品 I 国产综合精品一区二区三区 I 色婷婷国产 I 最新成人av在线 I 国产私拍精品 I 日韩成人影音 I 日日夜夜天天综合

Linux學(xué)習(xí)筆記18——信號1

系統(tǒng) 2325 0

一 信號的基本概念

  信號:是向進(jìn)程發(fā)送的軟件通知,通知進(jìn)程有事件發(fā)生。

  生成:表示一個信號的產(chǎn)生。

  捕獲:表示接收到一個信號。

  信號的壽命:信號的生成和傳遞之間的時間間隔。

  掛起的信號:已經(jīng)生成但還未被傳遞的信號。

二 產(chǎn)生信號

  每個信號名都是以SIG開頭,信號的名字都定義在signal.h中,POSIX必需的信號如下:


?

  信號         描述 


  SIGABRT       進(jìn)程放棄(signal abort)

  SIGALRM       告警時鐘(signal alarm)

  SIGBUS       訪問了內(nèi)存對象中的為定義部分

  SIGCHLD       子進(jìn)程被終止,停止或繼續(xù)(signal child)

  SIGCONT       如果進(jìn)程被停止了,本信號使進(jìn)程繼續(xù)執(zhí)行(signal continue)

  SIGFPE       算術(shù)計(jì)算中出現(xiàn)了被零除這樣的錯誤

  SIGHUP       在控制終端(進(jìn)程)上掛起(死亡)

  SIGILL       ? 無效的硬件指令

  SIGINT        交互終端提示信號(通常是Ctrl-C)

  SIGKILL       終止(signal kill)

  SIGPIPE       向一個沒有讀程序的管道寫入(signal pipe)

  SIGQUIT       交互終端終止(通常是Ctrl-l)(signal quit)

  SIGSEGV      ? 無效的內(nèi)存引用

  SIGSTOP      ? 執(zhí)行停止(signal stop)

  SIGTERM       終止(signal terminate)

  SIGTTIN       后臺進(jìn)程試圖進(jìn)行讀操作(signal try to input)

  SIGTTOU      ? 后臺進(jìn)程試圖進(jìn)行寫操作(signal try to output)

  SIGURG       在套接字上有高速寬數(shù)據(jù)

  SIGUSR1      ? 用戶定義的信號1

  SIGUSR2      ? 用戶定義的信號2


  1? 函數(shù)kill

      #include <signal.h>




      
        int
      
       kill(pid_t pid,    
      
        //進(jìn)程ID
      
      
int sig       //信號碼
     );          //成功返回0,不成功返回-1并設(shè)置errno

  參數(shù)pid的取值:>0???????     kill就向那個ID表示的進(jìn)程發(fā)送信號

         ? =0      kill就向調(diào)用程序的進(jìn)程組成員發(fā)送信號

         ? -1       kill就向所有它有權(quán)發(fā)送信息的進(jìn)程發(fā)送信號

          其它負(fù)值    就將信號發(fā)送到組ID等于|pid|的進(jìn)程組中去  

  kill的實(shí)現(xiàn)必須檢測的錯誤及相應(yīng)的錯誤碼:EINVAL:sig是一個無效的或不被支持的信號

                      EPERM:調(diào)用程序沒有適當(dāng)?shù)臋?quán)限

                      ESRCH:沒有進(jìn)程或進(jìn)程組對應(yīng)于pid

  例子:向進(jìn)程1000發(fā)送SIGUSR1 

      
        if
      
      (kill(
      
        1000
      
      
        ,SIGUSR1)){



    perro(
      
      
        "
      
      
        Failed to send the SIGUSR1 signal
      
      
        "
      
      
        );



}
      
    

  注:查找相關(guān)進(jìn)程ID的常用方法是使用getpid(獲取當(dāng)前進(jìn)程ID),getppid(獲取當(dāng)前進(jìn)程的父進(jìn)程ID),getpgid(獲取當(dāng)前進(jìn)程的進(jìn)程組ID),或者通過保存從fork中返回的值來查找。

  2 函數(shù)raise

      #include <signal.h>




      
        int
      
       raise(
      
        int
      
       sig);  
      
        //成功,返回0,不成功如果sig是無效的,raise函數(shù)就將error設(shè)置為EINVAL
      
    

  raise函數(shù)用來向自己發(fā)送一個信號。

  例子:使進(jìn)程向自己發(fā)送一個SIGUSR1信號

      
        if
      
      (raise(SIGUSR1)!=
      
        0
      
      
        ){



  perror(
      
      
        "
      
      
        Failed to raise SIGUSR1
      
      
        "
      
      
        );



}
      
    

  3 函數(shù)alarm

      #include <unistd.h>
      
        



unsigned alarm(unsigned seconds);
      
    

  alarm函數(shù)用來在seconds秒之后安排發(fā)送一個SIGALRM信號,alarm函數(shù)從來不報(bào)告錯誤。

?

三 對信號掩碼和信號集的操作

  信號掩碼:當(dāng)前被阻塞的信號的集合,類型為sigset_t.

  對信號集的操作由以下五個函數(shù)組成:

      #include <signal.h>




      
        int
      
       sigaddset(sigset_t *
      
        set
      
      ,
      
        int
      
      
         signo);        
        
          //將signo加入信號集 
        
      
      
        int
      
       sigdelset(sigset_t *
      
        set
      
      ,
      
        int
      
      
         signo);        
        
          //將signo從信號集中刪除 
        
      
      
        int
      
       sigemptyset(sigset_t *
      
        set
      
      
        );             
        
          //對信號集初始化,使其不包含任何信號 
        
      
      
        int
      
       sigfillset(sigset_t *
      
        set
      
      
        );             
        
          //對信號集初始化,使其包含所有信號 
        
      
      
        int
      
       sigismember(
      
        const
      
       sigset_t *
      
        set
      
      ,
      
        int
      
       signo);   
      
        //報(bào)告signo是否在*set中,如果在,返回1,否則返回0
      
    

  例子:對信號集twosigs進(jìn)行初始化,使其包含兩個信號SIGINT和SIGQUIT

      
        if
      
      ((sigemptyset(&twosigs)==-
      
        1
      
       || sigaddset(&twosigs,SIGINT)==-
      
        1
      
       || sigaddset(&twosigs,SIGQUIT)==-
      
        1
      
      
        )){



  perror(
      
      
        "
      
      
        Failed to set up signal mask
      
      
        "
      
      
        );



}
      
    

  進(jìn)程可以用sigprocmask函數(shù)來檢查或修改它的進(jìn)程信號掩碼,sigprocmask函數(shù)可以根據(jù)參數(shù)how指定的方法修改進(jìn)程的信號掩碼。新的信號掩碼由參數(shù)set指定,而原先的信號掩碼將保存到信號集oset中,聲明如下:

      #include <signal.h>




      
        int
      
       signalprocmask(
      
        int
      
       how,
      
        
          //用來說明信號掩碼的修改方式
        
        
           const
sigset_t *restrict set ,     //指向一個信號集的指針,在修改中要用到這個信號集,如果為NULL,就說明不需要進(jìn)行修改
           sigset_t *restrict oset        //如果不為NULL,sigprocmask會將修改之前的信號集放在*oset中返回
           );

  參數(shù)how取以下三個值中的一個:

  SIG_BLOCK:向當(dāng)前被阻塞的信號中添加一個信號集

  SIG_UNBLOCK:從當(dāng)前被阻塞的信號中刪除一個信號集

  SIG_SETMASK:將指定的信號集設(shè)置為被阻塞的信號

  例子:將SIGINT添加到進(jìn)程已經(jīng)阻塞的信號集中去

      
        sigset_t newsigset;




      
      
        if
      
      ((sigemptyset(&newsigset)==-
      
        1
      
       || sigaddset(&newsigset,SIGINT)==-
      
        1
      
      
        )){



  perror(
      
      
        "
      
      
        Failed to initialize the signal set
      
      
        "
      
      
        );



}




      
      
        else
      
      
        if
      
      (sigprocmask(SIG_BLOCK,&newsigset,NULL)==-
      
        1
      
      
        ){



  perror(
      
      
        "
      
      
        Failed to block SIGINT
      
      
        "
      
      
        );



}
      
    

?

Linux學(xué)習(xí)筆記18——信號1


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論