从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:~&gt; ./a.out ~/test.txtThe file exists @Mike 之所以有效,是因为 shell 在将 ~/test.txt 传递给您的程序之前会对其进行扩展。 (例如 echo ~/test.txt )请注意,您的测试是虚假的,如果由于某种原因 stat() 返回 -1,您无法断定该文件存在。 (例如 errno 可能是 ENOTDIR 和其他东西)

以上是关于从C程序中的linux命令获取返回码的主要内容,如果未能解决你的问题,请参考以下文章

Linux环境下编写C程序

如何在linux上编译c工程文件

linux程序里面怎么获取shell命令结果

Linux系统上的popen()库函数

linux下如何运行程序?

linux如何在终端启动程序后可以继续输入命令?