青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

大龍的博客

常用鏈接

統(tǒng)計

最新評論

Linux C語言 信號及信號的操作

一.信號
 1.信號的作用
  1.1.控制進(jìn)程
  1.2.實現(xiàn)簡單的多任務(wù)
  1.3.進(jìn)程間交換數(shù)據(jù)
 2.什么是信號
  2.1.信號是一個整數(shù)
    kill -l
  2.2.信號是軟中斷(模擬中斷)
    中斷就是在進(jìn)行某個過程,隨時停下來,并進(jìn)行其他過程,當(dāng)其他過程結(jié)束后回到原來過程的現(xiàn)象。
  2.3.信號的工作原理
    信號源(操作系統(tǒng),硬件,用戶程序)發(fā)出信號
    系統(tǒng)接收到信號(信號),系統(tǒng)查找信號的注冊表,并找到該進(jìn)程(信號目的地)對應(yīng)的信號處理函數(shù)(中斷函數(shù)),停止原進(jìn)程的實現(xiàn),執(zhí)行信號處理函數(shù),執(zhí)行完畢,繼續(xù)原進(jìn)程的執(zhí)行。
    
    信號與信號處理函數(shù)注冊必須缺省哪個進(jìn)程。
    a.信號源(系統(tǒng)進(jìn)程,用戶進(jìn)程)
    b.信號目的地(進(jìn)程)
    c.信號(有特殊含義的整數(shù))
    d.信號處理函數(shù)(函數(shù)void(*)(int))
  2.4.信號分類
    不可靠信號1-31(非實時信號)
    可靠信號34-64(實時信號)
  2.5.信號的編程模型:
    發(fā)送信號:kill函數(shù);或者其他鍵盤操作。
    信號處理函數(shù):void(*)(int);    
    注冊信號:signal函數(shù)
案例:
  體會信號SIGINT=2。
  處理信號2
結(jié)論:
  1.信號如果用戶不處理,系統(tǒng)會缺省處理    
    系統(tǒng)的缺省處理大部分情況,是輸出信號含義,并終止進(jìn)程。
    信號有缺省處理,也有忽略處理
    SIG_IGN  特殊的信號處理函數(shù)-忽略信號1
    (void(*)(int))1
    SIG_DFL  特殊的信號處理函數(shù)-缺省處理0
    (void(*)(int))0
  2.sleep,pause函數(shù)被信號中斷后,不會再繼續(xù),而是返回.
    函數(shù)類型:
    可重入函數(shù):
      中斷后可繼續(xù)執(zhí)行的函數(shù)
    不可重入函數(shù):
      中斷后函數(shù)不繼續(xù)執(zhí)行,而是返回結(jié)束。
  
  信號中斷會導(dǎo)致什么安全問題?
    多線程本身就是數(shù)據(jù)不安全的。
    
  2.6.發(fā)送信號
    int   kill(pid_t pid,//信號的目的地進(jìn)程
       int sig);//信號
    參數(shù)1:
       >0:進(jìn)程ID
       =0:同一個進(jìn)程組的所有進(jìn)程
       -1:所有進(jìn)程
       <-1:進(jìn)程組為|pid|的所有進(jìn)程
案例:
   使用kill發(fā)送信號
結(jié)論:
   1.在獨立兩個進(jìn)程之間,使用信號通信需要知道另外一個進(jìn)程ID。
   2.1-31之間的信號是不可靠。
    34-64信號是可靠的。
  2.7.案例:使用信號控制進(jìn)程。
     使用信號修改搖獎程序。
  
  2.8.案例:使用信號實現(xiàn)簡單的多任務(wù)。
   2.8.1.簡易版本的信號發(fā)送函數(shù)
     int raise(int sec)  向本進(jìn)程發(fā)送信號
     =int kill(getpid(),int sec);     
   2.8.2.準(zhǔn)備工作:定時器信號
     alarm    延時定時器
      向系統(tǒng)注冊,在指定的時間秒后發(fā)送一次SIGALRM信號。
     setitimer  間隔定時器
      向系統(tǒng)注冊,在指定的時間微秒后每隔一個間隔時間向進(jìn)程發(fā)送信號SIGALRM。
int setitimer(int which,//定時器計時方法
  const struct itimerval *val,//延時與間隔時間
  struct itimerval *oldval);//返回上次設(shè)置值
   
struct   itimerval
{
 struct  timeval it_interval;//間隔時間
 struct timeval  it_value;//延時時間
}     
struct timeval
{
 long tv_sec;//秒
 long tv_usec;//微秒
}
定時器計時方法:
   ITIMER_REAL    真實時間
       SIGALRM
   ITIMER_VIRTUAL  進(jìn)程實際運行時間
       SIGVTALRM
   ITIMER_PROF    進(jìn)程時間+內(nèi)核時間
       SIGPROF
   
     案例1:使用alarm設(shè)置系統(tǒng)的信號發(fā)送參數(shù)案例2:使用setitimer設(shè)置間隔定時時間
     結(jié)論:想馬上發(fā)送信號,不要把it_value設(shè)置為0秒0微秒,而是設(shè)置為0秒1微秒。  
   2.8.3.使用定時器實現(xiàn)與時間有關(guān)的子任務(wù)
    案例:
      顯示7位隨機(jī)數(shù)與時間。
    方法:
      一個進(jìn)程+定時器信號。      
 2.9.信號的操作
   2.9.1.信號屏蔽
   使用signal把某個信號忽略。只能對單個的信號處理,處理多個信號,需要反復(fù)調(diào)用signal函數(shù)
   a.背景:
     信號屏蔽的意義。
     保護(hù)一段代碼不受信號的中斷影響。
     等代碼執(zhí)行結(jié)束再處理信號。[信號不丟失,但被系統(tǒng)延遲處理]
   b.信號屏蔽函數(shù)
  int sigprocmask(int how,//信號操作方式
   const sigset_t *sigs,//操作的信號集合
   sigset_t *oldsigs);//返回原來的信號集合
  信號的操作方式:
    SIG_BLOCK  屏蔽信號
    SIG_UNBLOCK 解除信號屏蔽
    SIG_SETMASK 修改屏蔽信號
   
   sigset_t數(shù)據(jù)集合的操作:
    清空信號集合sigemptyset
    添加信號到集合sigaddset
    刪除集合中的某個信號sigdelset
    判定某個信號是否在集合中sigismember
    把所有信號添加到信號集合sigfillset
   編程模型:
     定義信號集合sigset_t sigs;
     初始化信號集合empty add del fill
     設(shè)置屏蔽信號sigprocmask  SIG_BLOCK
     解除屏蔽信號sigprocmask SIG_UNBLOCK
     判定某個信號是否在集合中ismember 
   SIGSTOP   SIGKILL
   2.9.2.查詢被屏蔽的信號是否發(fā)生
   背景:
     在被屏蔽代碼中,怎么知道被屏蔽的信號已經(jīng)發(fā)生?
   函數(shù):
     int sigpending(sigset_t *sigs);//返回發(fā)生的信號,而且該信號被屏蔽。
   問題:
     信號屏蔽的時候,信號發(fā)送,信號不被處理,解除信號屏蔽,信號才被處理。
     在信號屏蔽中,能否處理信號?
     答案:能
   問題:怎么處理?
     答案:解除屏蔽,然后再屏蔽。
   問題:
     信號屏蔽與解除屏蔽瞬間,其他信號是否會發(fā)生,導(dǎo)致程序解除。
     信號處理函數(shù)在執(zhí)行中,是否會被信號影響?肯定影響(本身信號不影響,被其他信號影響。)
     
   2.9.3.防止信號處理函數(shù)執(zhí)行中被信號影響。
     a.sigsuspend函數(shù)設(shè)置屏蔽信號
      該函數(shù)的作用:等待信號發(fā)生,當(dāng)信號發(fā)生,并且設(shè)置新的屏蔽信號,執(zhí)行信號處理函數(shù),執(zhí)行完畢,解除信號屏蔽,恢復(fù)原來的信號屏蔽,函數(shù)返回。
      int sigsuspend(const sigset_t*);
      等待信號:任意信號。
      在等待過程中,不受參數(shù)設(shè)置的信號集合中的信號影響。
      當(dāng)信號發(fā)生,處理信號,同樣不受參數(shù)設(shè)置的信號影響。
      信號處理結(jié)束,sigsuspend恢復(fù)原來的信號屏蔽,并且sigsuspend返回。
      
      sigsuspend該函數(shù)等待信號,沒有信號發(fā)生,該函數(shù)阻塞。信號發(fā)生,則處理后返回。
     結(jié)論:
       1.sigsuspend 解除原來的所有信號屏蔽
       2.沒有信號發(fā)生,sigsuspend阻塞。
       3.sigsuspend返回前,會恢復(fù)解除屏蔽的信號
       4.在解除原來的信號屏蔽,設(shè)置新的信號屏蔽。
       5.函數(shù)結(jié)束前,解除新的信號屏蔽
int sigsuspend(sigset_t *sig)
{
 1.sigprocmask(SIG_UNBLOCK,*s,0);
 2.sigprocmask(SIG_BLOCK,*sig,0);
 3.等待信號發(fā)生pause
 4.處理信號
 5.sigprocmask(SIG_UNBLOCK,*sig,0);
 6.sigprocmask(SIG_BLOCK,*s,0);
 7.return 0;
}        
  sigsuspend未必一定要在sigprocmask環(huán)境下工作

案例:
  利用sigsuspend控制進(jìn)程.
作業(yè):
  1.實現(xiàn)搖獎。
    要求:時間顯示使用SIALRM信號。
    控制:使用sigsuspend控制隨機(jī)數(shù)進(jìn)程。

注意:
  使用信號控制進(jìn)程.強(qiáng)烈建議:
    sigsuspend + signal + kill
  不推薦
    while(1);+signal+kill
    pause/sleep+signal+kill  

sigsuspend有兩個作用:
  定點信號處理。(屏蔽信號切換具備原子性)
  控制進(jìn)程。
     b.高級信號發(fā)送與處理函數(shù)處理信號。

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

void handle(int s){
 printf("信號發(fā)生.....\n");
}
main()
{
 signal(45,handle);
 /*printf("%d:%d\n",SIG_IGN,SIG_DFL);*/
 /*signal(SIGINT,SIG_IGN);*/
 while(1){
  /*printf("Hello信號!\n");*/
  /*sleep(1);*/
 }
}

 

#include <unistd.h>
#include <stdio.h>
#include <signal.h>
main()
{
 int i;
 for(i=0;i<10;i++){
  kill(4095,45);
 }
}

 

 

#include <curses.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <math.h>
#include <time.h>

int isstop=0;
void handle(){
 isstop=isstop==1?0:1;
}
main()
{
 /*變量區(qū)*/
 int i;
 sigset_t si;
 WINDOW *wtime,*wcode;
 pid_t pid_time,pid_code;
 pid_t pid_sub;
 initscr();
 sigfillset(&si);
 sigdelset(&si,34);
 noecho();
 curs_set(0); 
 wtime=derwin(stdscr,3,10,0,COLS-10);
 wcode=derwin(stdscr,3,9,(LINES-3)/2,(COLS-9)/2);
 keypad(stdscr,TRUE);
 keypad(wtime,TRUE);
 keypad(wcode,TRUE);
 box(wtime,0,0);
 box(wcode,0,0);
 refresh();
 wrefresh(wtime);
 wrefresh(wcode); 
 for(i=0;i<2;i++){
  if(pid_sub=fork())
  {
   if(i==0){
    pid_time=pid_sub;
   }
   if(i==1){
    pid_code=pid_sub;
   }
   continue;
  }
  else
  {
   if(i==0){
    /*子進(jìn)程1:時間顯示*/
    time_t tt;
    struct tm *t;
    while(1){
     tt=time(0);
     t=localtime(&tt);
     mvwprintw(wtime,1,1,"%02d:%02d:%02d",
          t->tm_hour,t->tm_min,t->tm_sec);
     refresh();
     wrefresh(wcode);
     wrefresh(wtime);
     sleep(1);
    }
    exit(0);
   }
   if(i==1){
    /*子進(jìn)程2:隨機(jī)數(shù)顯示*/
    int num; 
    signal(34,handle);   
    while(1){
     if(isstop){
      sigsuspend(&si);      
     }
     num=rand()%10000000;
     mvwprintw(wcode,1,1,"%07u",num);
     refresh();
     wrefresh(wtime);
     wrefresh(wcode);
     usleep(10000);
    }
    exit(0);
   }
  }   
 }
 /*主進(jìn)程:鍵盤輸入*/
 int ch;
 while(1){
  ch=getch();
  if(ch=='\n'){
   /*停止隨機(jī)數(shù)進(jìn)程*/
   /*發(fā)送信號:可靠信號>=34*/
   kill(pid_code,34);
  }
  /*退出整個任務(wù)*/
  if(ch=='x' || ch=='X'){
   /*通知子進(jìn)程結(jié)束*/   
   sched_yield();
   break;
  }
 }
 wait(0);
 wait(0);
 delwin(wtime);
 delwin(wcode);
 endwin();
 exit(0); 
}

posted on 2011-11-05 05:06 大龍 閱讀(748) 評論(0)  編輯 收藏 引用


只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久久午夜视频| 欧美h视频在线| 久久综合中文| 亚洲色图自拍| 免费成人激情视频| 国模套图日韩精品一区二区| 亚洲一区不卡| 99热这里只有精品8| 欧美刺激性大交免费视频 | 国产精品久久婷婷六月丁香| 亚洲国产精品成人精品| 久久亚洲私人国产精品va媚药| 亚洲一区一卡| 一区二区三区视频观看| 久久综合999| 亚洲国产高清aⅴ视频| 久久人人97超碰国产公开结果| 亚洲欧美综合一区| 国产亚洲综合在线| 浪潮色综合久久天堂| 久久久午夜视频| 亚洲第一综合天堂另类专| 久久永久免费| 久久综合九色99| 亚洲精品偷拍| 一本一本久久a久久精品综合麻豆| 欧美日韩亚洲天堂| 亚洲欧美综合v| 亚洲欧美日韩另类| 国产综合18久久久久久| 毛片av中文字幕一区二区| 久久只有精品| 一区二区毛片| 午夜精品一区二区三区在线视| 韩国v欧美v日本v亚洲v| 欧美高清免费| 欧美性猛交视频| 欧美在线啊v| 浪潮色综合久久天堂| 一区二区三区日韩欧美精品| 中文在线不卡| 亚洲大片在线观看| 99国产精品99久久久久久| 国产精品午夜电影| 免费观看欧美在线视频的网站| 久久综合影视| 午夜精品亚洲| 麻豆精品网站| 久久riav二区三区| 欧美国产亚洲视频| 久久国产66| 欧美日韩理论| 老牛国产精品一区的观看方式| 欧美精品九九99久久| 久久精品国产91精品亚洲| 欧美精品日韩一本| 老鸭窝毛片一区二区三区| 欧美日韩免费高清一区色橹橹| 久久九九有精品国产23| 欧美日韩亚洲高清一区二区| 久久久精品一品道一区| 欧美国产精品v| 久久亚洲欧美国产精品乐播| 欧美日韩一区二区三区视频 | 亚洲精品国产精品久久清纯直播| 欧美日韩系列| 亚洲成色最大综合在线| 国产精品揄拍一区二区| 亚洲欧洲美洲综合色网| 国产性天天综合网| 一区二区三区精品视频| 亚洲伦理在线免费看| 久久久蜜桃精品| 久久精品国产99国产精品澳门| 欧美日韩精品免费观看视频完整| 久久一二三区| 欧美一级黄色录像| 亚洲深夜福利视频| 牛夜精品久久久久久久99黑人| 久久av最新网址| 国产精品黄视频| 亚洲欧洲精品一区二区| 亚洲福利视频专区| 欧美一站二站| 久久精品99国产精品| 国产欧美日韩一区二区三区在线观看| 亚洲高清不卡| 亚洲国产女人aaa毛片在线| 性欧美video另类hd性玩具| 亚洲欧美在线aaa| 欧美午夜不卡视频| 国产精品99久久久久久白浆小说 | 性色一区二区| 国产精品久久国产精品99gif| 日韩视频在线观看| 亚洲视频一二| 国产精品久久久久国产a级| 在线亚洲自拍| 欧美在线影院在线视频| 国产亚洲va综合人人澡精品| 欧美亚洲在线播放| 久久五月天婷婷| 在线不卡中文字幕| 免费在线观看一区二区| 亚洲国产成人av| 一区电影在线观看| 欧美日韩综合在线| 午夜欧美大尺度福利影院在线看| 午夜精品福利一区二区三区av| 国产精品视频精品视频| 午夜精品久久久久久久久久久久久 | 久久综合亚州| 亚洲国产精品va在线观看黑人| 久久伊人一区二区| 91久久国产综合久久蜜月精品| 亚洲黄色三级| 国产精品二区影院| 午夜电影亚洲| 欧美肥婆在线| 亚洲自拍电影| 在线观看福利一区| 欧美激情a∨在线视频播放| 亚洲视频 欧洲视频| 久久精品一区二区国产| 亚洲高清视频在线| 国产精品a级| 久久精品国产v日韩v亚洲| 亚洲第一精品久久忘忧草社区| 亚洲午夜精品17c| 好吊成人免视频| 欧美日韩一卡| 久久国产婷婷国产香蕉| 亚洲精品日韩欧美| 久久久精品999| 99在线精品观看| 国产三级欧美三级| 欧美激情在线免费观看| 欧美一区二区三区喷汁尤物| 亚洲国产视频一区| 久久久久久亚洲精品中文字幕| 欧美日韩亚洲综合| 久久都是精品| 9色精品在线| 欧美成人高清视频| 欧美在线日韩在线| 一区二区三区鲁丝不卡| 依依成人综合视频| 国产免费亚洲高清| 欧美体内she精视频在线观看| 久久亚洲精选| 西瓜成人精品人成网站| 亚洲欧洲日产国产网站| 欧美mv日韩mv国产网站| 欧美在线日韩| 亚洲欧美日韩国产一区| 日韩视频一区二区三区| 在线观看欧美一区| 国产一区二区三区久久悠悠色av| 欧美人与性动交α欧美精品济南到| 久久久91精品国产一区二区精品| 一区二区三区视频免费在线观看| 亚洲福利视频专区| 欧美a级片网站| 久久久久国产一区二区三区| 午夜在线观看欧美| 亚洲一区二区三区影院| 亚洲另类自拍| 亚洲人成毛片在线播放| 亚洲第一偷拍| 1024亚洲| 136国产福利精品导航| 国内精品久久久久国产盗摄免费观看完整版| 欧美视频中文字幕在线| 欧美日本精品在线| 欧美三区在线观看| 欧美性色视频在线| 国产精品一二三四| 国产欧美91| 国产亚洲欧美日韩精品| 国产一区二区久久精品| 黄网站色欧美视频| 亚洲国产另类久久久精品极度| 亚洲国产精品久久久久久女王| 亚洲高清不卡av| 亚洲精品日韩一| 亚洲深夜福利| 午夜精品久久久久久久久久久久| 亚洲综合第一| 久久不射电影网| 久热精品视频在线观看| 欧美成人免费全部| 亚洲人成艺术| 亚洲视频在线观看视频| 亚洲综合欧美| 久久久精品日韩欧美| 欧美福利影院| 国产精品蜜臀在线观看| 国产伦精品一区二区三区在线观看| 国产区精品在线观看| 亚洲国产成人久久|