亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

APUE習題8.7

系統 1670 0

APUE習題8.7解答

APUE的8.7習題是關于exec的一個問題,書中描述了一句“POSIX.1明確要求再執行exec時關閉打開的目錄流”。我們需要自己來驗證下這個性質是否在自己的系統上有效,題目給我們提供了思路。

簡單的分析下,我們首先需要打開一個目錄,這個很簡單,使用 opendir() 函數,我們現在獲得是 DIR* 的變量,而我們要的是文件描述符fd,所以我們接著調用一個 dirfd() ,將獲得目錄的文件描述符。有了這些準備工作,我們就可以使用 fcntl() ?獲得執行時關閉狀態(close-on-exec).

接著我們簡單的判斷一下此時這個狀態是否打開的。這一步有利于我們接下來的判斷。接著我們將這個fd寫入到一個數組里面。用處在下面調用execl時最為參數使用。

我們創建一個進程,在子進程中我們調用execl函數,執行另一個程序,這個程序是利用剛才的描述符,嘗試去在調用exec時候打開一個目錄,看是否能打開。這就是這個程序的關鍵。

接著我們來嘗試著code。
exercise8-7.c

      
         1
      
       #include<dirent> 
      
        /*
      
      
        opendir()
      
      
        */
      
      
         2
      
       #include<unistd.h> 
      
        /*
      
      
        execl(),fcntl()
      
      
        */
      
      
         3
      
       ...  
      
        /*
      
      
        一些必要的頭文件
      
      
        */
      
      
         4
      
      
         5
      
      
        int
      
       main(
      
        void
      
      
        )


      
      
         6
      
      
        {


      
      
         7
      
           DIR *
      
        dir;


      
      
         8
      
      
        int
      
      
         val, fd;


      
      
         9
      
      
        char
      
       buf[
      
        10
      
      ]; 
      
        /*
      
      
        for save fd
      
      
        */
      
      
        10
      
      
        11
      
           dir = opendir(
      
        "
      
      
        /
      
      
        "
      
      
        );


      
      
        12
      
           fd =
      
         dirfd(dir);


      
      
        13
      
      
        14
      
      
        if
      
      ((val = fcntl(fd,F_GETFD,
      
        0
      
      )) < 
      
        0
      
      
        )


      
      
        15
      
               perror(
      
        "
      
      
        fcntl
      
      
        "
      
      
        );


      
      
        16
      
      
        if
      
      (val &
      
         FD_CLOEXEC)


      
      
        17
      
               printf(
      
        "
      
      
        close-on-exec is on\n
      
      
        "
      
      
        );


      
      
        18
      
      
        else
      
      
        19
      
               printf(
      
        "
      
      
        clsose-on-exec is off\n
      
      
        "
      
      
        );


      
      
        20
      
      
        21
      
           sprintf(buf,
      
        "
      
      
        %d\0
      
      
        "
      
      
        ,fd);


      
      
        22
      
      
        23
      
      
        if
      
      ((pid = fork()) < 
      
        0
      
      
        )


      
      
        24
      
               perror(
      
        "
      
      
        fork
      
      
        "
      
      
        );


      
      
        25
      
      
        else
      
      
        if
      
      (pid == 
      
        0
      
      
        )


      
      
        26
      
      
            {


      
      
        27
      
               execl(
      
        "
      
      
        /home/jesse/test/exercise8.7_child
      
      
        "
      
      ,
      
        "
      
      
        exercise8.7_child
      
      
        "
      
      
        ,buf,NULL);


      
      
        28
      
               exit(
      
        0
      
      
        );


      
      
        29
      
      
            }


      
      
        30
      
      
        31
      
      
        return
      
      
        0
      
      
        ;


      
      
        32
      
       }
    

?

    
      
        ?
      
    
  

上面就是我們的一個基本的框架,接著就是再exercise8.7_child.c中實現一個調用,這個就是很簡單了。
exercise8.7_child.c

      
         1
      
       #include<fcntl.h>  
      
        /*
      
      
        fcntl()
      
      
        */
      
      
         2
      
       ...     
      
        /*
      
      
        一些必要的頭文件
      
      
        */
      
      
         3
      
      
         4
      
      
        int
      
       main(
      
        int
      
       argc ,
      
        char
      
       *
      
        argv[])


      
      
         5
      
      
        {


      
      
         6
      
      
        int
      
      
         fd,val;


      
      
         7
      
      
         8
      
           sscanf(argv[
      
        1
      
      ], 
      
        "
      
      
        %d
      
      
        "
      
      , &
      
        fd);


      
      
         9
      
      
        if
      
      ((val = fcntl(fd,F_GETFD,
      
        0
      
      )) < 
      
        0
      
      
        )


      
      
        10
      
               perror(
      
        "
      
      
        fcntl
      
      
        "
      
      
        );


      
      
        11
      
      
        if
      
      (val &
      
         FD_CLOEXEC)


      
      
        12
      
               printf(
      
        "
      
      
        close-on-exec is on\n
      
      
        "
      
      
        );


      
      
        13
      
      
        else
      
      
        14
      
               printf(
      
        "
      
      
        clsose-on-exec is off\n
      
      
        "
      
      
        );


      
      
        15
      
      
        return
      
      
        0
      
      
        ;


      
      
        16
      
       }
    
    
      
        ?
      
    
  

我們執行一下

      
        1
      
       jesse@jesse:~/APUE/process$ ./a.
      
        out
      
      
        2
      
       close-on-exec 
      
        is
      
      
         on


      
      
        3
      
       jesse@jesse:~/APUE/process$ fcntl: Bad file descriptor
    
    
      ?
    
  

我們會發現,fcntl報錯了。說明這個fd不存在,也就是驗證了這個確實是在執行exec的時候,將文件描述符關閉了。

我們可以再延伸一些,我們試著將這個標志位關閉,看看結果如何,我們猜想應該是會顯示“close-on-exec is off"

我們使用diff,看看哪兒需要更改

      jesse@jesse:~/APUE/process$ diff -u exercise8.
      
        7
      
      
        .c exercise8.7_child.c 


      
      --- exercise8.
      
        7
      
      .c    
      
        2014
      
      -
      
        04
      
      -
      
        25
      
      
        10
      
      :
      
        57
      
      :
      
        23.004544016
      
       +
      
        0800
      
      

+++ exercise8.7_child.c    
      
        2014
      
      -
      
        04
      
      -
      
        25
      
      
        11
      
      :
      
        11
      
      :
      
        14.064562979
      
       +
      
        0800
      
      
        

@@ 
      
      -
      
        19
      
      ,
      
        8
      
       +
      
        19
      
      ,
      
        6
      
      
         @@

         printf(
      
      
        "
      
      
        close-on-exec is on\n
      
      
        "
      
      
        );

     
      
      
        else
      
      
        

         printf(
      
      
        "
      
      
        close-on-exec is off\n
      
      
        "
      
      
        );


      
      -    val &= ~
      
        FD_CLOEXEC;


      
      -
      
            fcntl(fd,F_SETFD,val);

     sprintf(strfd,
      
      
        "
      
      
        %d\0
      
      
        "
      
      
        ,fd);



     
      
      
        if
      
      ((pid = fork()) < 
      
        0
      
      )
    
    
      ?
    
  

更改的就兩行,利用F_SETFD,來實現的。

執行的結果

      
        1
      
       jesse@jesse:~/APUE/process$ ./a.
      
        out
      
      
        2
      
       close-on-exec 
      
        is
      
      
         on


      
      
        3
      
       jesse@jesse:~/APUE/process$ close-on-exec 
      
        is
      
       off
    

?

結果符合猜想。

系統默認的是保持FD_CLOEXEC這個標志打開的,也就是說執行exec的時候是會關閉打開的目錄的。

APUE習題8.7


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

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

【本文對您有幫助就好】

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

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 老子影院我不卡 | 亚洲欧洲日韩国产aa色大片 | 国产全黄一级毛片 | 精品亚洲在线 | 天天躁夜夜躁很很躁麻豆 | 99综合 | 国产高清a毛片在线看 | 成人黄色小视频 | 视频大全在线观看免费 | 一级毛片免费视频观看 | 精品乱人伦一区二区 | xx性欧美高清 | 日本免费毛片在线高清看 | 亚洲综合精品香蕉久久网 | 亚洲日本久久久午夜精品 | 四虎影视国产精品婷婷 | 色图综合网 | 欧美性www| 中文字幕11页 | 91精品成人福利在线播放 | 欧美一级毛片日本 | www四虎在线高清 | 亚洲免费网站在线观看 | 欧美不卡视频在线 | 深夜视频在线 | 国产亚洲精品一区二区久久 | 爱爱免费网站 | 日韩欧美中文字幕在线视频 | 黄色α片| 四虎免费视频 | 99久久免费国产精品m9 | 久99久爱精品免费观看视频 | 日韩一级黄色录像 | 中文字幕久精品免费视频蜜桃视频 | 欧美一区二区三区视频在线观看 | 日本欧美小视频 | 亚洲香蕉久久一区二区三区四区 | 色综合一本到久久亚洲91 | 香蕉视频一级 | 亚洲另类伦春色综合妖色成人网 | 嘿嘿嘿视频免费网站在线观看 |