C 执行器返回255
我的代码在Mac上运行,我从exec获得255个返回代码。 代码如下:C 执行器返回255,c,unix,C,Unix,我的代码在Mac上运行,我从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
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);
}
}
}
ret=execvp(pArgs[0],pArgs);
如果(ret<0)
{
ret=errno;
出口(ret);
返回false;
}
else if(processId<0)
{
//fork()失败
返回false;
}
否则,如果(等待)
{
//分叉成功,请等待退出
if(waitpid(processId和childstatus,0)=processId)
{
//代码设计命令已终止,获取返回代码
如果(妻子退出(子女身份))
{
如果(pCmdRetStatus!=NULL)
*pCmdRetStatus=WEXITSTATUS(childstatus);
}
}
}
你有没有想过为什么会这样?基本上是一个hdiutil调用,很多时候,我得到255个。被强制进入0-255个无符号范围
因此,对execvp
的调用的返回值-1
在C代码中会被处理为-1,但在操作系统级别上会由于以下原因变为255。考虑下面的例子:
bash> bash
bash2> exit -1
bash> echo $? # The exit status of the last command (bash2)
255
在出现错误时返回一个整数(-1)(并设置errno,您应该检查/打印它(提示:
perror
),然后将其传递到exit
)。Exit实际上只知道Exit\u失败
和Exit\u成功
,但它通常只是将值传递给操作系统(操作系统通常可以处理0-127/0-255,但不依赖它) exec的唯一可能返回值是0和-1。我猜变量ret
的类型是错误的(unsigned char
而不是int
),因此-1被转换成模256到255。如果你把printf(“%s\n”,strerror(errno))调用execvp
(顺便说一下,如果返回,它将始终返回-1
,如果返回成功,它将不返回)。perror()说什么?execve
手册页列出了大量可能失败的原因。!=实际上,exec
唯一可能的返回值是-1
:如果成功,它不会返回。哈哈,你当然是对的。那是我犯的一个相当愚蠢的错误。@reza:如果我是迟钝的话,我很抱歉。对execvp
的调用可能会返回值-1,这将导致进程以状态代码255退出。基本上,UNIX操作系统只允许退出状态的值为0-255,-1自动更改为255。无符号i=-1
不是255(或特定实现的最大大小),因为2是补码,而是因为C标准规定必须是。@rubenvb:aha,你说得对!感谢您指出这一点,我已经更新了我的答案。答案中链接的页面的一个剪报显示,尽管等待的父进程只能使用最低有效8位(即status&0377)。
。首先,我相信这是八进制,也就是十六进制中的0xFF。但我无法屏蔽它,而是必须取模:int converted=status%0xFF
获取匹配的答案