在Unix环境中,有没有办法以编程方式在C中调用哪个?

时间:2009-02-11 04:30:15

标签: c unix

对于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);

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

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

这样哪个函数会返回我正在尝试调用的命令的目录。

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

由于

编辑:我想最糟糕的是我可以做一个大量的if-else语句,根据cmd参数设置'directory'vbl。

3 个答案:

答案 0 :(得分:2)

你要求的是命令'which',即

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

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

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

man 3 exec

你会发现execlp()和execvp()会处理搜索给定命令的PATH并执行它的细节。

答案 1 :(得分:1)

为了实现这一点,我会:

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

修改:您可能也想要遵循符号链接。

答案 2 :(得分:1)

不是我知道了,但你可以模仿辅助函数的哪个功能。我需要在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结构。