Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 执行器返回255_C_Unix - Fatal编程技术网

C 执行器返回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

我的代码在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 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
获取匹配的答案