2011-06-23 3 views
1

Macでコードを実行していて、execから255のリターンコードを取得しています。 コードは次のとおりです。exec return 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文字ですか?本質的にhdiutil呼び出し、多くの時間、私は255を取得します。

+0

'printf("%s \ n " strerror(errno)); '' execvp'の呼び出しの後(常に '-1'を返します。成功した場合は戻りません)。 –

+0

'perror()は何と言っていますか? 'execve'のmanページには、失敗する可能性のある大きな理由のリストがあります。 –

+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になります。次の例を考えてみましょう:あなたはexitに渡す:

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

' unsigned i = -1'は2の補数のために255(または特定の実装の最大サイズ)ではありませんが、C標準ではそれが必要であると言われています。 – rubenvb

1

execvpは(perror)あなたは/プリント(ヒントをチェックする必要がありますされて、errnoを設定)、エラーに(-1)の整数を返します。 Exitは実際にはEXIT_FAILUREEXIT_SUCCESSしか知りませんが、通常は値をOSに渡しただけです(通常は0-127/0-255を処理できますが、カウントしません)。

0

のみ可能な戻り値 S exec 用は0であり、 は-1。私は変数retの型が間違っていると推測しています(の代わりにint)-1が256から255にモジュロ変換されています。

+2

実際、 'exec'の唯一の可能な戻り値は' -1'です:成功すれば返りません。 –

+0

もちろんあなたは正しいです。それは私のかなり愚かな間違いでした。 –