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

posts - 200, comments - 8, trackbacks - 0, articles - 0

linux高級編程day06 筆記(轉)

Posted on 2013-01-04 10:42 鑫龍 閱讀(636) 評論(0)  編輯 收藏 引用 所屬分類: 楊強linux視頻筆記系列

問題解答:
  1.exit(狀態碼)返回狀態碼有什么意義?
   返回值被系統得到.系統根據狀態碼進行日志記錄.
   返回值被調用者得到:system/wait.程序會根據返回狀態碼進行對應處理。
   exit(狀態碼)=main函數中的return 狀態碼; 
  2.狀態碼的第二個字節才是exit()的返回值或者return值。

一.進程的基本控制
 1.進程的常見控制函數
   1.1.為什么需要控制進程?
   1.2.pause/sleep/usleep
   1.3.atexit  on_exit 


#include <stdio.h>
#include <stdlib.h> 
void fun()
{
    printf("over\n");
}
main()
{
    atexit(fun); //注冊終止函數(即main執行結束后調用的函數) 
    printf("Process!\n");
}
2.進程與文件鎖
   在多進程下文件讀寫是共享的
   問題:
     怎么知道一個文件正在被另外進程讀寫?
   解決方案:
     文件鎖。(建議鎖)
   API:
     fcntl(文件鎖受內核參數影響)  
   編程技巧:
     對文件加鎖
     判定一個文件是否存在鎖
   函數說明:
     int fcntl(
       int fd,//被加鎖的文件描述符號
       int cmd,//鎖的操作方式:F_SETLK(已經加鎖,異常返回) F_UNLK F_SETLKW(已經加鎖,則阻塞等待)
       struct flock *lk);//鎖的描述
     
     返回值:
       0:加鎖成功
       -1:加鎖失敗

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
main()
{
    int fd;
    struct flock lk;
    int r;
    //打開一個文件
    fd=open("a.txt",O_RDWR);
    if(fd==-1) printf(":%m\n"),exit(-1);
    //描述鎖
    lk.l_type=F_WRLCK;
    lk.l_whence=SEEK_SET;
    lk.l_start=5;
    lk.l_len=10;
    //加鎖
    r=fcntl(fd,F_SETLK,&lk);
    if(r==0) printf("加鎖成功!\n");
    else    printf("加鎖失??!\n");
    while(1);    
}
案例:
   寫兩個程序:
      A:加鎖
      B:獲取鎖的信息
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
main()
{
    int fd;
    struct flock lk;
    int r;
    //打開一個文件
    fd=open("a.txt",O_RDWR);
    if(fd==-1) printf(":%m\n"),exit(-1);
    //描述鎖
    lk.l_type=F_WRLCK;
    lk.l_whence=SEEK_SET;
    lk.l_start=5;
    lk.l_len=3;
    //加鎖
    r=fcntl(fd,F_SETLK,&lk);
    if(r==0) printf("加鎖成功!\n");
    else    printf("加鎖失?。n");
    while(1);    
} 
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>

main()
{
    int fd;
    struct flock lk={0};
    int r;
    
    fd=open("a.txt",O_RDWR);
    if(fd==-1) printf("::%m\n"),exit(-1);
    
    r=fcntl(fd,F_GETLK,&lk);
    if(r==0) 
        printf("得到鎖成功!\n");
    if(lk.l_type==F_WRLCK)
    {
        printf("寫鎖!\n");
    }
    printf("start:%d,len:%d\n",lk.l_start,lk.l_len);
    
    printf("PID:%d\n",lk.l_pid);
    
}
鎖也是一個進程可以共享的信息。
   
二.信號
 1.信號的作用
   背景:
     進程之間通信比較麻煩。
     但進程之間有必須通信,比如父子進程之間。
   作用:
     通知其他進程響應。進程之間通信機制.
     信號:
      接受信號的進程馬上停止.調用信號處理函數.
     信號處理函數:
      默認處理函數.
        打印信號信息,退出進程.
      用戶處理函數.       
   中斷:
     軟中斷.
     
案例:
  1.進程之中,默認信號處理
  2.進程之中,用戶信號處理 

#include <unistd.h>
#include <stdio.h>
#include <signal.h>
void handle(int s)
{
    printf("我是信號發生!\n");    
}

main()
{
    //signal(SIGWINCH,handle);
    signal(35,handle);
    while(1)
    {
        //printf("進程在執行:%d!\n",getpid());
        
//sleep(1);
    }
}
3.中斷
  
  kill -s 信號  進程ID
  kill -信號  進程ID     
  信號:數字1-31  34-64
     宏SIGINT=2
  ctrl+d 發送信號2 SIGINT
  kill -l察看所有信號    
  
  信號SIGKILL SIGSTOP不能被處理.
  
  
案例:
  發送信號
  int kill(pid_t pid,int s)
  進程ID:
    >0:發送信號到指定進程
    =0:發送信號到該進程所在進程組的所有進程
    -1:發送給所有進程,除init外
    <0:發送給指定的進程組(組ID=絕對值) 

#include <stdio.h>
#include <signal.h>
main()
{
    int i;
    //while(1)
    for(i=0;i<5;i++)
    {
        kill(4601,35);
        
    }
}
2.信號發送與安裝
   signal
   kill
 3.信號的應用
   3.1.延時器timeout
     SIGALRM
     信號發出函數:alarm
   3.2.定時器
int setitimer(int which,//計時方式
                        
//ITIMER_REAL 墻上時間,時鐘時間
                       // ITIMER_VIRTUAL 系統空間時間+用戶空間時間
                       //ITIMER_PROF ITIMER_VIRTUAL+休眠時間

            const struct itimerval *val,//定時器的時間參數
            struct itimer *oldval);//返回原來設置的定時器
                                            
//如果=NULL,則不返回
struct itimerval
{
        struct timeval it_interval;//間隔時間:定時器周期
        struct timeval it_value;//延時時間:過多久定時器開始生效
}
struct timeval
{
     long tv_sec;//秒
     long tv_usec;//微妙
}

#include <stdio.h>
#include <signal.h>
#include <sys/time.h>
void deal(int s)
{
    printf("起床!\n");
    
}
main()
{
    struct itimerval v={0};
    
    signal(SIGALRM,deal);
    
    //v.it_value.tv_sec=3; //程序啟動3秒后觸發,可以不設定tv_usec
    v.it_value.tv_sec=0;
    v.it_value.tv_usec=1;  //讓程序一啟動就觸發。不能設為0
    v.it_interval.tv_sec=1; //間隔1秒
    
//alarm(5);
    setitimer(ITIMER_REAL,&v,0);
    while(1)
    {
        //..
    }
}
信號應用:
     系統與應用程序之間
     應用于應用程序之間
     父子進程之間 
  案例1:
     使用定時器信號,實現多任務.
     實現:
       實現7位隨機數
       使用中斷實現時間的顯示

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <math.h>
#include <curses.h>
WINDOW *w;
int num;
int isstop=0;
void handle(int s)
{
    if(s==SIGUSR1)
    {
        if(isstop==1)
            isstop=0;
        else
            isstop=1;
    }
}

main()
{
    initscr();
    curs_set(0);//隱藏光標
    noecho();//禁止輸入回顯
    
//keypad(stdscr,TRUE);
    
//keypad(w,TRUE);
    
//創建子窗體
    w=derwin(stdscr,3,11,(LINES-3)/2,(COLS-11)/2);
    box(w,0,0);//給子窗體加邊框
    refresh();
    wrefresh(w);
    if(fork())
    {
        //顯示7位數的隨機數
        signal(SIGUSR1,handle);
        while(1){
            if(isstop==1)
            {
                pause();//pause會被信號中斷停止 ***
            }
            num=rand()%10000000;//產生7位隨機數
            mvwprintw(w,1,2,"%07d",num);//顯示隨機數
            refresh();//刷新屏幕。
            wrefresh(w);
            usleep(10000);//暫停10毫秒
        }
    }
    else
    {
        //處理按鍵
        while(1)
        {
            getch();
            //if(ch==KEY_ENTER)
            {
                kill(getppid(),SIGUSR1);
            }
        }
    }
    
    endwin();
}
 案例2:
     實現父子進程之間通信
     
     控制進程.
          
   sleep與pause函數被信號影響后,sleep不再繼續sleep.
   pause不再pause.
練習:
   1.在curses顯示7位隨機數     
   
   其他信號函數
     raise
   
 4.信號的可靠與不可靠以及信號的含義
   信號有丟失.(信號不排隊,壓縮成一個)
   由于歷史的緣故:信號有壓縮的需求.
   可靠信號(實時信號)與不可靠信號(非實時信號).
   
   早期信號 1-31 31個信號, 不可靠(與系統有關).
   后期信號34-64 31個信號,可靠信號(用戶信號)  
   
   這就是"不可靠信號"的來源。它的主要問題是:
  • 進程每次處理信號后,就將對信號的響應設置為默認動作。在某些情況下,將導致對信號的錯誤處理;因此,用戶如果不希望這樣的操作,那么就要在信號處理函數結尾再一次調用signal(),重新安裝該信號。
  • 信號可能丟失,后面將對此詳細闡述。
    因此,早期unix下的不可靠信號主要指的是進程可能對信號做出錯誤的反應以及信號可能丟失。

Linux支持不可靠信號,但是對不可靠信號機制做了改進:在調用完信號處理函數后,不必重新調用該信號的安裝函數(信號安裝函數是在可靠機制上的實現)。因此,Linux下的不可靠信號問題主要指的是信號可能丟失。


 5.信號的操作
   信號導致的問題
   1.信號屏蔽 
int sigprocmask(int how,//操作方式
                SIG_BLOCK
                SIG_UNBLOCK
                SIG_SETMASK
    const sigset_t *sigs,//操作的信號集合
    sigset_t *oldsigs);//返回原來操作的信號集合
  1.聲明信號集合
       sigset_t  sigs;
      2.加入屏蔽信號
        一組信號集合維護函數:
        2.1. 清空集合sigemptyset
        2.2. 添加信號到集合sigaddset
        2.3. 從集合刪除信號sigdelset
        2.4. 添加所有信號到集合sigfillset
        2.5. 判定信號是否在集合sigismember
     3.屏蔽信號
     4.接觸屏蔽 
      
   2.信號屏蔽的切換
     int sigsuspend(sigset_t *sigs);
     屏蔽新的信號,原來的信號失效.
     sigsuspend是阻塞函數.對參數信號屏蔽.
     對參數沒有指定的信號不屏蔽,但當沒有屏蔽信號處理函數調用完畢
     sigsuspend返回條件:
        1.信號發生,并且信號是非屏蔽信號
     
     sigsuspend設置新的屏蔽信號,保存舊的屏蔽信號
     而且當sigsuspend返回的時候,恢復舊的屏蔽信號.

#include <stdio.h>
#include <signal.h>
void h(int s)
{
    printf("非屏蔽信號發生!\n");
}
main()
{
    sigset_t sigs;
    
    signal(SIGWINCH,h);
    
    sigemptyset(&sigs);
    sigaddset(&sigs,2);
    printf("屏蔽開始!\n");
    sigsuspend(&sigs);
    printf("屏蔽結束!\n");
    
}
3.查詢被屏蔽而未達到進程的信號(查詢正在排隊的信號)
     int sigpending(sigset_t *sets); 

#include <stdio.h>
#include <signal.h>
void h(int s)
{
    printf("抽空處理int信號\n");
}
main()
{
    int sum=0;
    int i;
    //1.
    signal(SIGINT,h);
    sigset_t sigs,sigp,sigq;
    //2.
    sigemptyset(&sigs);
    sigemptyset(&sigp);
    sigemptyset(&sigq);
    
    sigaddset(&sigs,SIGINT);
    //3.
    sigprocmask(SIG_BLOCK,&sigs,0);
    for(i=1;i<=10;i++)
    {
        sum+=i;
        sigpending(&sigp);
        if(sigismember(&sigp,SIGINT))
        {
            printf("SIGINT在排隊!\n");
            sigsuspend(&sigq);
            //使原來屏蔽信號無效,開放原來信號
            
//使新的信號屏蔽,
            
//當某個信號處理函數處理完畢
            
//sigsuspend恢復原來屏蔽信號,返回 
        }
        sleep(1);
    }
    printf("sum=%d\n",sum);
    sigprocmask(SIG_UNBLOCK,&sigs,0);
    printf("Over!\n");
}

回顧:
  1.進程控制sleep pause
  2.理解信號的中斷流程
  3.發射信號(Shell/code),處理信號
  4.alarm與setitimer
  5.信號應用:實現簡單多任務與進程之間通信
  6.使用信號+sleep/pause控制進程
  7.信號的屏蔽
  8.了解sigpending與 sigsuspend的使用.

作業:
  
  1.寫一個程序,創建兩個子進程,分別計算1-5000與5001-1000素數,
     通過信號讓,父進程專門完成數據保存.
  
  2.完成課堂上的作業:
     顯示7位隨機數,同時使用定時器信號顯示時間
     在使用鍵盤控制7位隨機數的停止與繼續顯示.
     (建議美化) 
  3.完成如下作業:
     在屏幕水平同時顯示移動兩個字符.
  
思考:
  信號處理函數調用過程中,是否被其他信號影響.        
   
明天:
 1.信號與進程間數據傳遞
   sigqueue=kill與sigaction=signal
 2.IPC:
   基于文件
     無序文件:映射
     有序文件:管道文件:有名/匿名
          socket文件
   基于內存
     無序內存
        內存共享
     有序內存  
        共享隊列


 

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            国产欧美日韩视频一区二区| 亚洲巨乳在线| 国产综合色精品一区二区三区| 欧美理论电影在线播放| 欧美超级免费视 在线| 美女黄网久久| 欧美日韩国产123| 欧美日韩一区二区三区免费| 国产精品福利久久久| 国产女主播一区二区三区| 国产在线拍偷自揄拍精品| 在线观看精品| 正在播放亚洲| 久久久久久色| 亚洲国产日韩精品| 亚洲欧洲在线视频| 亚洲男人的天堂在线aⅴ视频| 午夜视频在线观看一区二区三区 | 9i看片成人免费高清| 一区二区三区四区蜜桃| 午夜免费在线观看精品视频| 久久久久久久一区| 亚洲欧美三级伦理| 亚洲国产一区二区三区a毛片| 韩国久久久久| 亚洲天堂网站在线观看视频| 久久久夜夜夜| 999亚洲国产精| 久久精品国产精品| 欧美日韩免费看| 一色屋精品视频在线看| 一区二区国产在线观看| 久久免费少妇高潮久久精品99| 亚洲国产精品视频| 欧美亚洲视频在线看网址| 欧美第一黄色网| 国产日韩欧美在线看| 一区二区三区蜜桃网| 香蕉久久夜色精品国产| 亚洲国产精品传媒在线观看| 欧美一区二区三区免费在线看| 欧美日本国产精品| 亚洲成人在线| 久久九九国产精品怡红院| 一区二区三区久久久| 麻豆精品在线视频| 黄色成人免费网站| 久久国产精品亚洲77777| 一区二区三区精密机械公司| 欧美精品一区二区三区久久久竹菊 | 久久全球大尺度高清视频| 在线日韩av永久免费观看| 亚洲资源在线观看| 亚洲七七久久综合桃花剧情介绍| 久久国产精品毛片| 国产真实久久| 久久久视频精品| 欧美一区1区三区3区公司| 国产精品高清网站| 亚洲综合视频一区| 一区二区免费在线观看| 国产精品豆花视频| 午夜激情综合网| 亚洲校园激情| 国产欧美精品| 久久精品免费| 欧美一区成人| 激情久久五月| 亚洲大片免费看| 欧美激情国产日韩| 一本久道久久综合中文字幕| 99成人在线| 国产精品久久97| 欧美尤物巨大精品爽| 欧美日韩情趣电影| 欧美伊人久久久久久久久影院| 亚洲国产精品va在线看黑人| 欧美精品福利| 一本大道久久a久久精品综合| 亚洲国产精品激情在线观看| 欧美大片第1页| 亚洲一区二区三区免费观看 | 另类欧美日韩国产在线| 久久久999精品| 亚洲日本无吗高清不卡| 99热这里只有成人精品国产| 国产美女一区| 欧美成人精品在线观看| 欧美精品日韩www.p站| 亚洲欧美中文字幕| 久久黄金**| 亚洲靠逼com| 一区二区三区欧美激情| 国产日韩欧美成人| 亚洲高清av在线| 国产精品你懂的在线| 欧美成人dvd在线视频| 欧美日在线观看| 久久亚洲欧洲| 欧美三级韩国三级日本三斤| 欧美综合第一页| 欧美激情精品久久久六区热门 | 亚洲网站在线播放| 在线观看免费视频综合| 亚洲三级电影在线观看| 国产亚洲欧美色| 亚洲美女啪啪| 亚洲国产高清视频| 亚洲国产精品成人精品| 亚洲无吗在线| 99av国产精品欲麻豆| 欧美一二三区精品| 一本久道久久综合中文字幕| 亚洲欧美日韩国产一区二区三区| 亚洲激情网站| 久久国产精品黑丝| 亚洲一区免费观看| 欧美精品成人在线| 欧美国产一区二区| 国产在线不卡视频| 亚洲欧美文学| 亚洲欧美在线一区二区| 欧美日韩精品一区视频| 欧美激情视频一区二区三区不卡| 国产亚洲一区在线播放| 亚洲一区亚洲| 亚洲在线国产日韩欧美| 欧美高清视频在线播放| 欧美成人精品一区| 在线免费观看一区二区三区| 亚洲欧美日韩电影| 亚洲综合社区| 嫩草影视亚洲| 欧美少妇一区| 最新精品在线| 亚洲高清av| 另类天堂av| 美女视频一区免费观看| 国产亚洲人成网站在线观看| 亚洲欧美日韩国产综合| 亚洲一本视频| 国产精品爱啪在线线免费观看| 亚洲精选大片| 亚洲影音一区| 国产区精品在线观看| 亚洲免费一在线| 亚洲欧美激情精品一区二区| 欧美二区在线看| 亚洲精品乱码久久久久久按摩观| 亚洲剧情一区二区| 欧美激情精品久久久久久| 最新成人av网站| 亚洲免费影视第一页| 国产日韩一区二区三区在线播放 | 伊人影院久久| 久久天天躁夜夜躁狠狠躁2022| 久久综合网hezyo| 亚洲国产精品电影在线观看| 欧美激情一区二区三区| 99精品久久久| 久久九九精品| 亚洲激情在线视频| 欧美日韩在线播放一区| 亚洲午夜久久久| 久久久天天操| av成人免费在线| 国产视频不卡| 欧美成人视屏| 亚洲一区黄色| 欧美激情网友自拍| 亚洲欧美日韩一区二区三区在线观看| 国产伦精品一区二区三区高清| 久久久国产精品一区| 91久久在线视频| 久久久999成人| 日韩视频在线观看| 国产精品亚洲片夜色在线| 久久一区二区三区国产精品 | 欧美在线视频全部完| 亚洲福利视频免费观看| 欧美精品成人| 久久精品一区二区国产| 亚洲美女一区| 老色批av在线精品| 亚洲主播在线观看| 亚洲经典一区| 国产三区精品| 欧美日韩激情小视频| 久久久精品性| 亚洲男人的天堂在线| 日韩图片一区| 亚洲级视频在线观看免费1级| 久久精品国产精品亚洲综合| 亚洲视频精选| 亚洲欧洲一区二区天堂久久| 国产一区激情| 国产婷婷色综合av蜜臀av| 欧美性色综合| 欧美日韩一二三四五区| 欧美成人官网二区|