【发布时间】:2019-03-13 19:52:20
【问题描述】:
当我在 RHEL 7.4 中运行以下 C 代码时:
errno = 0;
status = system("ls >> /tmp/test.txt");
sprintf(msg, "Value of errno: %d\n", errno);
sprintf(msg, "Status: %d ", status);
os_log_msg(msg);
我得到 -1 和 errno = 10 的返回码(没有子进程)。 /tmp/test.txt 文件实际上是创建的,所以它可以工作,但程序看到一个非零返回码并退出。
问题是该命令在 HP-UX 11.11 中返回 0,但我们迁移到 RHEL 7.4,现在得到 -1。
【问题讨论】:
-
你为什么把
extern int errno放在那里?您应该使用来自<errno.h>的标准errnomacro -
是的,我知道这是一个精简的摘要,但这里不足以回答这个问题。如果我根据我所看到的进行推测,我会猜测
/tmp/test.txt已经存在并且不能被 OP 写入。但是谁知道可能省略了哪些实际相关的代码,这会导致我得出不同的猜测/结论? -
这真的是完整的程序吗?例如,如果您将
SA_NOCLDWAIT添加到SIGCHILD处理程序的标志中,您当然可以触发此错误。 -
@sturcotte06:系统使用 shell 来执行参数。 Posix 标准引用:“system() 函数的行为就像使用 fork() 创建子进程一样,并且子进程使用 execl() 调用 sh 实用程序,如下所示:
execl(<shell path>, "sh", "-c", command, (char *)0);” -
@JEtheDBA,我想要一个 善意 minimal reproducible example,正如 Barmar 已经要求的那样。如果到目前为止您所介绍的内容实际上是问题的特征,那么 MCVE 不必多于几行。我还想知道相对于运行程序的用户,您尝试将命令输出重定向到的文件的存在、所有权和权限。如果在强制模式下启用了 SELinux 属性(CentOS 7 的默认设置),则包括 SELinux 属性。