【问题标题】:In a Unix Environment, is there a way to programmatically call Which in C? [closed]在 Unix 环境中,有没有办法以编程方式调用 C 中的哪个? [关闭]
【发布时间】:2009-02-11 04:30:14
【问题描述】:

对于 C 语言的项目,我们需要在 Unix 服务器上构建一个 shell。

它需要能够执行 Unix 原生的功能,而不是 bash(或任何其他 Unix shell)。

我正在编写一个方法,希望能够概括对命令的调用。变成一个通用函数:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <string.h>
#include <limits.h>

void execCmd(char* cmd,char* options)
{
   char directory[MAX_CANON] = "/bin/"; //currently is just set to /bin
   char* toExec = strcat(directory,cmd);

我想将变量“目录”设置为我正在调用的 Unix 命令的正确目录。

所以,从本质上讲,我希望能够使用类似的东西 char 目录[MAX_CANON] = which(cmd);

这样 which 函数将返回我尝试调用的命令的目录。

如果您觉得这不是一个好的解决方案,请推荐其他方式。

谢谢

编辑:我想最坏的情况我可以做一个大量的 if-else 语句,根据 cmd 参数设置“目录”vbl。

【问题讨论】:

    标签: c unix


    【解决方案1】:

    你要的是命令'which',即

    me@stackoverflow:~$ which which
    /usr/bin/which
    

    在 linux 上它是一个 shell 脚本,所以请看一下。

    但是,我不认为这是制作 UNIX shell 所必需的。如果你输入

    man 3 exec
    

    您会发现 execlp() 和 execvp() 负责在 PATH 中搜索给定命令并执行它的细节。

    【讨论】:

    • 谢谢, execlp(cmd,cmd,NULL);成功了!
    【解决方案2】:

    要在本地实现这一点,我会:

    • 使用getenv 获取PATH
    • PATH 解析为候选组件列表(strtok 的所有错误都是经典工具),
    • 对于每个PATH 组件:形成/possible/path/to/cmd 并使用stat 系列函数来测试该文件是否存在并且用户是否具有执行权限。继续直到找到它或用完 PATH...

    编辑:您可能也想关注符号链接。

    【讨论】:

      【解决方案3】:

      我不知道,但您可以模仿辅助函数上的哪些功能。我需要在 PATH 环境变量中的所有路径中搜索一个名为您的命令的文件,然后检查该文件是否可执行,然后您可能找到了您的可执行文件。

      要获取 PATH 变量,您可以使用 getenv()。您需要使用 strtok() 将其拆分。你可以使用 opendir() 来搜索目录,如下所示:

      #include <sys/types.h>
      #include <dirent.h>
      
      ...
          DIR *dir;
          struct dirent *dp;
      ...
          if ((dir = opendir (".")) == NULL) {
              perror ("Cannot open .");
              exit (1);
          }
      
      
          while ((dp = readdir (dir)) != NULL) {
          }
      ... 
      

      在 readdir() 函数手册页上检查不同的结构。

      【讨论】:

        猜你喜欢
        • 2015-07-13
        • 2010-10-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多