欧美三区_成人在线免费观看视频_欧美极品少妇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條評論
主站蜘蛛池模板: 欧美久操 | 毛片黄片 | 欧美一级三级 | 三上悠亚2022最新新作番号 | 日本久久综合网 | 欧美大胆一级视频 | 亚洲美女亚洲精品久久久久 | 欧美在线一区二区三区欧美 | 国产一区二区久久 | 欧美日韩一区二区在线视频播放 | 欧美精品一区二区在线电影 | 欧美日韩一区二区三区在线观看 | 熟女毛片| 国产 麻豆 | 国产精品亚洲一区二区三区在线 | av网站免费看 | 久草手机在线视频 | 国产欧美一区二区 | 人人澡人人爱 | 免费一级片在线观看 | 欧美成人在线免费观看 | 色噜噜影院 | 国产色在线| 国产专区在线视频 | 欧美zzzz| 爱爱综合网| 精品久久久久久亚洲综合网 | 亚洲精品乱码8久久久久久日本 | 日本妇人成熟A片一区-老狼 | 爱爱视频网 | 九热| 欧美日韩视频在线第一区二区三区 | 天天碰天天干 | 日韩欧美中文字幕在线观看 | 亚洲另类自拍 | 欧美不在线 | 91专区在线观看 | 俄罗斯厕所偷窥视频 | 天天爱夜夜做 | 无遮挡很爽很污很黄的网站w | 久久久久91 |