<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    我的家園

    我的家園

    Linux 獲取其他程序返回值

    Posted on 2012-04-15 16:37 zljpp 閱讀(751) 評論(0)  編輯  收藏
    例:

    status = system("./test.sh");  
     

    1、先統一兩個說法:
    (1)system返回值:指調用system函數后的返回值,比如上例中status為system返回值
    (2)shell返回值:指system所調用的shell命令的返回值,比如上例中,test.sh中返回的值為shell返回值。
     
    2、如何正確判斷test.sh是否正確執行?
    僅判斷status是否==0?或者僅判斷status是否!=-1? 
     
    都錯!
     
    3、man中對于system的說明
     
    RETURN VALUE
           The value returned is -1 on error (e.g.  fork() failed), and the return
           status  of  the command otherwise.  This latter return status is in the
           format specified in wait(2).  Thus, the exit code of the  command  will
           be  WEXITSTATUS(status).   In  case  /bin/sh could not be executed, the
           exit status will be that of a command that does exit(127).
    看得很暈吧?
     
    system函數對返回值的處理,涉及3個階段:
    階段1:創建子進程等準備工作。如果失敗,返回-1。
    階段2:調用/bin/sh拉起shell腳本,如果拉起失敗或者shell未正常執行結束(參見備注1),原因值被寫入到status的低8~15比特位中。system的man中只說明了會寫了127這個值,但實測發現還會寫126等值。
    階段3:如果shell腳本正常執行結束,將shell返回值填到status的低8~15比特位中。
    備注1:
    只要能夠調用到/bin/sh,并且執行shell過程中沒有被其他信號異常中斷,都算正常結束。
    比如:不管shell腳本中返回什么原因值,是0還是非0,都算正常執行結束。即使shell腳本不存在或沒有執行權限,也都算正常執行結束。
    如果shell腳本執行過程中被強制kill掉等情況則算異常結束。
     
    如何判斷階段2中,shell腳本是否正常執行結束呢?系統提供了宏:WIFEXITED(status)。如果WIFEXITED(status)為真,則說明正常結束。
    如何取得階段3中的shell返回值?你可以直接通過右移8bit來實現,但安全的做法是使用系統提供的宏:WEXITSTATUS(status)。
     
     
    由于我們一般在shell腳本中會通過返回值判斷本腳本是否正常執行,如果成功返回0,失敗返回正數。
    所以綜上,判斷一個system函數調用shell腳本是否正常結束的方法應該是如下3個條件同時成立:
    (1)-1 != status
    (2)WIFEXITED(status)為真
    (3)0 == WEXITSTATUS(status)
     
    注意:
    根據以上分析,當shell腳本不存在、沒有執行權限等場景下時,以上前2個條件仍會成立,此時WEXITSTATUS(status)為127,126等數值。
    所以,我們在shell腳本中不能將127,126等數值定義為返回值,否則無法區分中是shell的返回值,還是調用shell腳本異常的原因值。shell腳本中的返回值最好多1開始遞增。
     
    判斷shell腳本正常執行結束的健全代碼如下:
        #include <stdio.h>   
        #include <stdlib.h>   
        #include <sys/wait.h>   
        #include <sys/types.h>   
          
        int main()  
        {  
            pid_t status;  
          
          
            status = system("./test.sh");  
          
            if (-1 == status)  
            {  
                printf("system error!");  
            }  
            else  
            {  
                printf("exit status value = [0x%x]\n", status);  
          
                if (WIFEXITED(status))  
                {  
                    if (0 == WEXITSTATUS(status))  
                    {  
                        printf("run shell script successfully.\n");  
                    }  
                    else  
                    {  
                        printf("run shell script fail, script exit code: %d\n", WEXITSTATUS(status));  
                    }  
                }  
                else  
                {  
                    printf("exit status = [%d]\n", WEXITSTATUS(status));  
                }  
            }  
          
            return 0;  
        }  
    

      

     
    WIFEXITED(stat_val) Evaluates to a non-zero value if status
    was returned for a child process that
    terminated normally.

    WEXITSTATUS(stat_val) If the value of WIFEXITED(stat_val) is
    non-zero, this macro evaluates to the
    low-order 8 bits of the status argument
    that the child process passed to _exit()
    or exit(), or the value the child
    process returned from main().

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 四虎国产精品免费久久影院| 男人的好免费观看在线视频| 免费无遮挡无码永久在线观看视频| 亚洲色图黄色小说| 日韩精品极品视频在线观看免费| 亚洲成A人片在线观看无码不卡 | 6080午夜一级毛片免费看6080夜福利 | 亚洲中文字幕无码一久久区| 一本久久A久久免费精品不卡| 亚洲精品视频免费观看| 国产成人高清精品免费观看| 亚洲精品乱码久久久久久| a级男女仿爱免费视频| 亚洲电影中文字幕| 99视频全部免费精品全部四虎| 亚洲免费视频网址| 四虎成人免费观看在线网址 | 久久综合九九亚洲一区| 一级毛片免费播放| 亚洲成A人片在线播放器| 波多野结衣久久高清免费| 麻豆安全免费网址入口| 亚洲综合精品香蕉久久网| 无码av免费网站| 亚洲国产视频久久| 内射无码专区久久亚洲| a级特黄毛片免费观看| 精品亚洲成a人片在线观看少妇| 免费a级毛片无码a∨蜜芽试看| 免费人妻精品一区二区三区| 亚洲卡一卡2卡三卡4卡无卡三| 成年女人毛片免费视频| 五月天婷婷免费视频| 久久精品国产亚洲AV电影 | 久久99久久成人免费播放| 亚洲色图黄色小说| 啊v在线免费观看| 一级毛片在线免费观看| 亚洲1区2区3区精华液| 国产国拍亚洲精品mv在线观看| 美女被cao免费看在线看网站|