代码之家  ›  专栏  ›  技术社区  ›  AndyG

在Unix环境中,有没有一种方法可以在C中以编程方式调用Which?[关闭]

  •  1
  • AndyG  · 技术社区  · 17 年前

    它需要能够执行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);
    

    char目录[MAX_CANON]=哪个(cmd);

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

    谢谢

    3 回复  |  直到 13 年前
        1
  •  2
  •   Paul    17 年前

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

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

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

    man 3 exec
    

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

        2
  •  1
  •   dmckee --- ex-moderator kitten    17 年前

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

    • 使用 getenv 获取 PATH
    • 解析 路径 进入候选组件列表( strtok
    • 路径 /possible/path/to/cmd stat 用于测试fif的家族函数此文件存在,并且用户具有执行权限。继续,直到你找到它或用完为止 路径 ...

    编辑:

        3
  •  1
  •   Edwin Jarvis    17 年前

    我不知道,但你可以在助手函数上模仿哪个功能。我需要在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()函数手册页上的dirent结构。