对于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。
答案 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结构。