c - C中访问并运行/usr/bin程序

标签 c linux fork exec

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

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

最佳答案

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

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

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

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

关于c - C中访问并运行/usr/bin程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55988787/

相关文章:

mysql - 找不到 Curses 库

python - 为什么调用守护进程时 Python check_output() 不返回?

c - 理解 c 中的 fork

c++ - Linux:fork & execv,等待子进程挂起

linux - server.sh : 2: . : properties. conf: 未找到

mysql - 我无法调试 shell 脚本中的简单错误

使用指针算法将数据从第一个数组复制到第二个数组

c - (float32) 4 字节 (uint8) 转换为 float64 (c++/C)

c - C中删除内存

Const 自引用结构