欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

APUE習題8.7

系統(tǒng) 1744 0

APUE習題8.7解答

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

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

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

我們創(chuàng)建一個進程,在子進程中我們調用execl函數(shù),執(zhí)行另一個程序,這個程序是利用剛才的描述符,嘗試去在調用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中實現(xiàn)一個調用,這個就是很簡單了。
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
      
       }
    
    
      
        ?
      
    
  

我們執(zhí)行一下

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


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

我們會發(fā)現(xiàn),fcntl報錯了。說明這個fd不存在,也就是驗證了這個確實是在執(zhí)行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,來實現(xiàn)的。

執(zhí)行的結果

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


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

?

結果符合猜想。

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

APUE習題8.7


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

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

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

【本文對您有幫助就好】

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

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 欧美亚洲综合久久 | 91日本在线观看亚洲精品 | 26uuu在线观看| 色蜜桃网 | 久久精品黄色 | 99爱在线精品视频免费观看9 | 天天看逼| 欧美精品午夜久久久伊人 | 欧美亚洲激情在线 | 色屁屁www影院入口免费观看 | 青青草福利视频 | 97理论三级九七午夜在线观看 | 台湾三级无遮挡在线播放 | 夜夜夜操 | 全免费午夜一级毛片一级毛 | 夜本色| 久久久久国产精品一区 | 九九久久99综合一区二区 | 日本一区二区三区不卡在线看 | 激情视频免费看 | 亚卅毛片 | 欧美日韩成人在线观看 | 成人网在线 | 欧美激情一区二区亚洲专区 | 欧美精品日韩一区二区三区 | 成人福利视频在线看高清观看 | 91福利影院| 色综合 成人 | 成人在线视频网站 | 欧美精品v国产精品v日韩精品 | 国产色婷婷精品综合在线观看 | 日本三日本三级香港三级 | 成年美女黄的视频网站 | 色播视频在线观看 | 久久久久久久国产 | 久久亚洲精品国产精品黑人 | 精品日韩视频 | 国产全肉乱妇杂乱视频 | 久久精品2 | 亚洲国产精品一区 | 91精品影视 |