1. 程式人生 > >Linux system 函式返回值

Linux system 函式返回值

如何判斷階段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().