从C程序中的linux命令获取返回码
Posted
技术标签:
【中文标题】从C程序中的linux命令获取返回码【英文标题】:Get return code from linux command in C program 【发布时间】:2012-09-10 17:39:36 【问题描述】:我基本上是在尝试检查特定文件是否存在。为此,我正在使用 Unix 的 test 命令。
sprintf(execbuf, "%s if test -r %s ; then true; else exit; fi;",
execbuf, st->file, NO_FILE);
它工作正常,但如果文件不在这里,我不想退出,而是应该返回 FAIL。
我不知道如何让程序返回失败。我正在考虑使用上述命令的退出代码,但我仍然无法弄清楚如何在程序中的 Linux 命令之外使用该退出代码。
【问题讨论】:
使用stat()
函数不是更容易吗?还是access()
?
根据您对我建议的解决方案的评论,您是说您正在尝试通过 C 代码运行 shell 脚本并想确定结果?
sprintf()
什么时候获得了执行程序的能力?
【参考方案1】:
我建议您只使用access() 调用,而不是执行外部shell 命令来解决这个问题。
请注意,这种情况会受到竞争条件的影响 - 当您调用 access() 时文件可能存在(或执行确定文件是否存在的 shell 命令),但当您稍后真正需要它时它可能会消失在。如果这对您来说是个问题,只需 open() 文件,然后在您实际需要 I/O 时使用文件描述符。
【讨论】:
【参考方案2】:如果你还没有和你现在所做的事情结婚,那么我建议你使用 stat:
#include <sys/stat.h>
#include <stdio.h>
int main (int argc, char** argv[])
struct stat sts;
if (stat(argv[1], &sts) == -1 && errno == ENOENT)
printf ("The file %s doesn't exist...\n", argv [1]);
else
printf("The file exists\n");
这会告诉你它是否存在。如果你不想在命令行中传递,参数 1 是一个 const char*,所以只需传递文件名即可。
【讨论】:
stat 的问题是我们需要传递一个绝对路径给它。但在我正在执行 $HOME/file.sh 的情况下,即使文件存在,stat 也会返回 -1。 您根本不需要将绝对路径传递给它。~/file.txt
之类的东西甚至会起作用。
stat
调用不需要绝对路径,使用相对路径即可。但是,它确实需要一个有效的路径——它不会为你做波浪号或变量扩展,所以$HOME/foo
和~/foo
都不起作用。
真的吗?因为它适用于我的系统...mike@linux-4puc:~> ./a.out ~/test.txt
The file exists
@Mike 之所以有效,是因为 shell 在将 ~/test.txt 传递给您的程序之前会对其进行扩展。 (例如 echo ~/test.txt
)请注意,您的测试是虚假的,如果由于某种原因 stat() 返回 -1,您无法断定该文件存在。 (例如 errno 可能是 ENOTDIR 和其他东西)以上是关于从C程序中的linux命令获取返回码的主要内容,如果未能解决你的问题,请参考以下文章