在 C 中访问和 运行 /usr/bin 程序

Accessing and running /usr/bin programs in C

对于 C 程序中 /usr/bin 目录中的 运行 程序,最有效的方法是什么?我的任务是获取用户输入,如果用户输入与 bin 中的程序匹配,运行 相应的程序。

我想将所有 bin 程序的名称放入一个文本文件中,然后使用循环遍历文件中的每个单词,同时将单词与输入进行比较。但是,我认为这可能会重新发明轮子。有没有简化的方法来做到这一点?

我建议查看您从用户那里获得的名称是否与 /usr/bin 目录中的文件相匹配,以及它是否使用 system 函数来 运行 这个程序。

https://linux.die.net/man/3/system

#include <stdlib.h>
int system(const char *command);

FILE *file;
if (file = fopen(userinput, "r")){
    fclose(file);
    system(userinput);
}

在任何类 UNIX OS 上从现有进程调用程序的 "classical" 方法是使用 exec() functions 之一。当您阅读 exec() 时,大多数教程都会从解释另一个函数开始:fork()。这些函数 非常 经常一起使用,但不要太在意,因为它们本身都很有用。

为了回答您的问题,一种相当有效的方式来完成您所追求的事情:

  1. 从您的任何来源获取用户生成的输入
  2. (可选,调用 fork()
  3. 调用execvp()函数
  4. 您在这里做什么将取决于您是否在步骤 (2) 中调用了 fork(),以及您在执行您描述的任务后打算做什么(如果有的话)。

execvp() 将通过自动在您的环境 PATH 中搜索与第一个参数匹配的文件名来为您完成跑腿工作。如果当前环境没有设置PATH,会默认为/bin:/usr/bin。由于调用 exec() 可以产生 return 值的唯一方法是调用失败时,您可能希望在步骤 (4) 中检查 errno 的值。如果用户输入与环境 PATH 中的任何可执行文件都不匹配,errno 将设置为 ENOENT。具体如何执行此操作以及哪些额外步骤可能值得采取将取决于您是否分叉,以及对您的程序的任何其他要求。