2011-06-23 110 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

哈哈当然你是对的。这是我的一个非常愚蠢的错误。 –