2009-02-11 45 views
1

对于C中的项目,我们需要在Unix服务器上构建一个shell。在Unix环境中,有没有一种方法可以以编程方式调用C中的哪个?

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

这样,哪个函数会返回我试图调用的命令的目录。

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

感谢

编辑:我想在最坏的情况,我可以做一个巨大的if-else语句,设置基于CMD参数的“目录” VBL。

回答

2

什么你问的是命令“的”,即

[email protected]:~$ which which 
/usr/bin/which 

在Linux上是一个shell脚本,所以来看看甘德。

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

man 3 exec 

你会发现,execlp()和execvp()照顾搜索给定的命令路径和执行它的细节。

+0

谢谢,execlp(cmd,cmd,NULL);诀窍! – AndyG 2009-02-11 04:48:37

1

为了实现这一点本身,我想:

  • 使用getenv获取PATH
  • 解析PATH进入候选组件的列表(strtok种种缺点是经典的工具),
  • 对于每个PATH组件:表格/possible/path/to/cmd并使用stat家族函数来测试此文件是否存在并且用户具有执行权限。继续直到你找到它还是用完了PATH ...

编辑:你可能想跟随符号连接,太。

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结构。

相关问题