【问题标题】:How to catch a specific linux system return如何捕捉特定的linux系统返回
【发布时间】:2012-06-01 01:55:09
【问题描述】:

我最近开始使用linux,所以对它知之甚少。至少我知道linux中的每一件事都是一个文件。

我想知道如何捕获特定的linux系统返回,例如如果我选择了install ruby​​ (sudo apt-get -y install ruby​​),我怎么知道它安装成功了?

char buffer[1024];
char *buf = malloc(4096);

char *pl;
FILE *fp;

if (strcmp(cmd, "ruby") == 0)
{
        fp = popen("sudo apt-get -y install ruby", "r");
}

if (fp == NULL)
{
        printf("Failed to load file\n");
        exit(0);
}

while ((pl = fgets(buffer, sizeof(buffer), fp)) != NULL)
{
        strcat(buf, buffer);
}

strcat(buf, "\n");

pclose(fp);

然后我使用 popen 读取打开的文件,但它包含终端中显示的相同内容,我只想要一个“标志”,如 OK 或 FAIL。

对不起,我的英语不好。

【问题讨论】:

  • 您可能想要system 函数?
  • 为什么以后不列出已安装的包来查看是否已安装?
  • 您真的没有阅读 popen() 手册页吗?老实说?
  • 其实我不知道这个页面,对不起。

标签: c linux file return


【解决方案1】:

您需要检查正在运行的程序的退出状态。见:http://linux.die.net/man/3/popen

The pclose() function waits for the associated process to terminate and returns the
exit status of the command as returned by wait4(2).

每个进程都提供一个退出状态(一个整数,从 0 到 255),表明程序如何/为什么 结束了。 0 通常用于正常(成功)执行,这是您应该使用的 正在寻找。

尝试查看 apt-get 的手册页或在谷歌上搜索 apt-get 的正确退出代码。

希望对你有帮助!

【讨论】:

  • 不客气。记得接受任何对你有帮助的答案(如果有的话)。
【解决方案2】:

apt-get 的退出代码会告诉你它是否成功(0 表示成功)。 pclose(fp) 将返回退出代码,所以你可以这样做:

if (pclose(fp) == 0) {
  // success
} else {
  // failure
}  

不过,您可能会注意到,现在我们实际上并没有从管道中读取数据。没有任何理由拥有它。所以就像 Joachim 建议的那样,system() 函数可能更适合您的情况。

【讨论】:

  • 我确实尝试过使用系统功能,但我注意到在执行命令后我应该创建一个日志然后从管道读取似乎是更简单的方法。事实上,我在 C 和 Linux 方面都是初学者。谢谢你们。
猜你喜欢
  • 2023-03-15
  • 1970-01-01
  • 2017-09-22
  • 2011-09-04
  • 2012-02-11
  • 2018-07-21
  • 1970-01-01
  • 1970-01-01
  • 2015-05-27
相关资源
最近更新 更多