【问题标题】:exec returning 255执行返回 255
【发布时间】:2023-03-26 20:45:01
【问题描述】:

我的代码在 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);
        }

    }   
}

关于为什么要使用 255 有什么想法吗?本质上是一个 hdiutil 调用,很多时候,我得到 255。

【问题讨论】:

  • 如果你在调用execvp之后加上printf("%s\n", strerror(errno));,你会得到什么(顺便说一句,如果它返回,它总是会返回-1——如果成功,它不会返回) .
  • perror() 说什么? execve 手册页列出了很多可能失败的原因。

标签: c unix


【解决方案1】:

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

【讨论】:

  • @reza:对不起,如果我很迟钝。您对execvp 的调用可能会返回值-1,这将导致您的进程以状态码255 退出。基本上,UNIX 操作系统只允许值0-255 表示退出状态,而-1 会自动更改为255。跨度>
  • unsigned i = -1 不是 255(或特定实现的最大大小),因为 2 的补码,而是因为 C 标准规定它必须是。
  • @rubenvb:啊哈,你是对的!感谢您指出这一点,我已经更新了我的答案。
  • 答案中链接的分页片段显示though only the least significant 8 bits (that is, status &amp; 0377) shall be available to a waiting parent process.。对于初学者,我相信这是八进制的,十六进制为 0xFF。但我无法掩盖它,而是必须取模:int converted = status % 0xFF; 以获得匹配的答案
  • 有趣hhmm
【解决方案2】:

execvp 出错时返回一个整数 (-1)(并设置 errno,您应该检查/打印它(提示:perror)),然后将其传递给exit。 Exit 确实只知道EXIT_FAILUREEXIT_SUCCESS,但它通常只是将值传递给操作系统(通常可以处理0-127 / 0-255,但不要指望它)。

【讨论】:

    【解决方案3】:

    exec唯一可能的返回值s是0,是-1。我猜变量 ret 的类型是错误的(unsigned char 而不是 int),因此 -1 被模 256 转换为 255。

    【讨论】:

    • 其实exec唯一可能的返回值是-1:如果成功则不返回。
    • 哈哈你当然是对的。这是我的一个非常愚蠢的错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多