2011-06-23 108 views
1

我有我的代碼在Mac上運行,我得到一個來自exec的255返回碼。 以下是代碼:exec返回255

ret = execvp(pArgs[0], pArgs); 

    if (ret < 0) 
{ 
     ret = errno; 
     exit(ret); 
     return false; 
    } 
else if (processId < 0) 
{ 
    // fork() failed  
    return false; 
    } 
else if(Wait) 
{ 
    // forked successfuly so wait for exit 
    if(waitpid(processId, &childstatus, 0) == processId) 
    { 
     // codesign command terminted, get return code 
     if(WIFEXITED(childstatus)) 
     { 
      if(pCmdRetStatus != NULL) 
       *pCmdRetStatus = WEXITSTATUS(childstatus); 
     } 

    } 
} 

對於爲什麼255的任何想法?本質上是一個hodiutil調用,很多次,我得到了255.

+0

如果你把'printf(「%s \ n」, strerror(errno));在調用execvp後(如果返回,它總是返回-1),如果成功則不返回)。 –

+0

'perror()'說什麼? 'execve'手冊頁有很多可能會失敗的原因。 –

+3

['execvp'](http://pubs.opengroup.org/onlinepubs/9699919799/functions/exec.html)!= ['fork'](http://pubs.opengroup.org/onlinepubs/9699919799/functions /fork.html) – pmg

回答

10

UNIX (and therefore Mac OS X) exit statuses被強制進入範圍0-255無符號。

因此,從您撥打電話到execvp-1的返回值在您的C代碼中將被處理爲-1,但由於the rules of the exit() function specification,在操作系統級別將被處理爲255。請看下面的例子:

bash> bash 
bash2> exit -1 
bash> echo $? # The exit status of the last command (bash2) 
255 
+0

沒有得到這一點,對不起 – reza

+1

@reza:對不起,如果我是鈍的。您對'execvp'的調用可能會返回值-1,這會導致您的進程退出時出現狀態碼255.基本上,UNIX操作系統只允許0-255的值用於退出狀態,-1會自動更改爲255. – maerics

+1

'由於2的補碼,無符號i = -1'不是255(或特定實現的最大尺寸),但是因爲C標準說它必須是。 – rubenvb

1

execvp返回出錯的整數(-1)(並設置errno,您應該檢查/打印(提示:perror)),它傳遞給exit。退出真的只知道EXIT_FAILUREEXIT_SUCCESS,但它通常只是將值傳遞給操作系統(通常可以處理0-127/0-255,但不要指望它)。

0

唯一可能的返回值 s 對於exec 是0並且 是-1。我猜測變量ret的類型是錯誤的(unsigned char而不是int),因此-1被模256轉換爲255.

+2

實際上,'exec'唯一可能的返回值是'-1':如果成功,它不會返回。 –

+0

哈哈當然你是對的。這是我的一個非常愚蠢的錯誤。 –