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

在UNIX环境中,有没有一种方法可以用C语言编程地调用哪个?[关闭]

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

    对于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命令将变量'directory'设置为正确的目录。

    所以,在本质上,我希望能够使用 char目录[max_canon]=哪个(cmd);

    这样哪个函数将返回我要调用的命令的目录。

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

    谢谢

    编辑:我想最坏的情况下,我可以做一个大规模的if-else语句,基于cmd参数设置“directory”vbl。

    3 回复  |  直到 12 年前
        1
  •  2
  •   Paul    15 年前

    你要的是“哪个”命令

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

    在Linux上,它是一个shell脚本,所以看看Gander。

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

    man 3 exec
    

    您会发现execlp()和execvp()负责搜索给定命令的路径并执行它的详细信息。

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

    为了本机实现这一点,我将:

    • 使用 getenv 获得 PATH
    • 解析 路径 在候选组件列表中( strtok 因为它的所有缺点都是经典的工具)。
    • 对于每一个 路径 组件:表单 /possible/path/to/cmd 并使用 stat 用于测试FIF的家族函数此文件存在,并且用户具有执行权限。继续,直到找到或用完 路径

    编辑: 你也可能想使用符号链接。

        3
  •  1
  •   Edwin Jarvis    15 年前

    我没有意识到这一点,但是您可以模拟助手函数上的哪些功能。我需要搜索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结构。