日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

APUE習(xí)題8.7

系統(tǒng) 1936 0

APUE習(xí)題8.7解答

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

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

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

我們創(chuàng)建一個(gè)進(jìn)程,在子進(jìn)程中我們調(diào)用execl函數(shù),執(zhí)行另一個(gè)程序,這個(gè)程序是利用剛才的描述符,嘗試去在調(diào)用exec時(shí)候打開一個(gè)目錄,看是否能打開。這就是這個(gè)程序的關(guān)鍵。

接著我們來嘗試著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
      
       }
    

?

    
      
        ?
      
    
  

上面就是我們的一個(gè)基本的框架,接著就是再exercise8.7_child.c中實(shí)現(xiàn)一個(gè)調(diào)用,這個(gè)就是很簡(jiǎ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
    
    
      ?
    
  

我們會(huì)發(fā)現(xiàn),fcntl報(bào)錯(cuò)了。說明這個(gè)fd不存在,也就是驗(yàn)證了這個(gè)確實(shí)是在執(zhí)行exec的時(shí)候,將文件描述符關(guān)閉了。

我們可以再延伸一些,我們?cè)囍鴮⑦@個(gè)標(biāo)志位關(guān)閉,看看結(jié)果如何,我們猜想應(yīng)該是會(huì)顯示“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,來實(shí)現(xiàn)的。

執(zhí)行的結(jié)果

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


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

?

結(jié)果符合猜想。

系統(tǒng)默認(rèn)的是保持FD_CLOEXEC這個(gè)標(biāo)志打開的,也就是說執(zhí)行exec的時(shí)候是會(huì)關(guān)閉打開的目錄的。

APUE習(xí)題8.7


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

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

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

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦?。。?/p>

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 珲春市| 富裕县| 东明县| 齐齐哈尔市| 鄂州市| 高雄市| 龙口市| 奇台县| 大荔县| 合阳县| 马龙县| 蓝田县| 武汉市| 成武县| 法库县| 清徐县| 什邡市| 临邑县| 大连市| 成武县| 鹤壁市| 班玛县| 湖南省| 玉屏| 锦州市| 疏附县| 洞头县| 资阳市| 资源县| 嘉义县| 武汉市| 饶平县| 遂宁市| 腾冲县| 乌兰察布市| 洛扎县| 贡嘎县| 嵊泗县| 临漳县| 合阳县| 阿拉善右旗|