English 中文(简体)
在Unix环境中,是否有一种在C中以编程方式调用Which的方法?[关闭]
原标题:
  • 时间: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);

我希望将变量 "directory" 设置为我要调用的 Unix 命令的正确目录。

So, in essence, I would like to be able to use something like char directory[MAX_CANON] = which(cmd);

这样,which函数就会返回我要调用的命令的目录。

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

谢谢 (Xiè xiè)

编辑:如果必要我可以编写大量的if-else语句,根据cmd参数设置目录vbl。

最佳回答

你所要求的是“which”的命令,即

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

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

然而,我认为这并非制作UNIX Shell所必需的。如果您输入

man 3 exec

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

问题回答

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

  • Use getenv to acquire the PATH
  • parse the PATH into a list of candidate components (strtok for all its faults is the classic tool),
  • For each PATH component: form /possible/path/to/cmd and use a stat family function to test fif this file exists and the user has execute permission. Continue until you find it or run out of PATH...

编辑:您可能还想跟踪符号链接。

据我所知没有,但是你可以在一个辅助函数上模拟which功能。我需要在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结构。





相关问题
热门标签