C++ 在Linux中使用c+;从环境变量中查找文件的路径名+;
因此,我试图使用C/C++在Ubuntu中创建一个命令行解释器 这是我们大学实验室任务的一部分 CLI的基本功能是从用户获取输入,对其进行解析以查找命令及其参数,然后从环境变量中查找命令的路径名C++ 在Linux中使用c+;从环境变量中查找文件的路径名+;,c++,c,linux,environment-variables,C++,C,Linux,Environment Variables,因此,我试图使用C/C++在Ubuntu中创建一个命令行解释器 这是我们大学实验室任务的一部分 CLI的基本功能是从用户获取输入,对其进行解析以查找命令及其参数,然后从环境变量中查找命令的路径名 我已经能够解析字符串,获取命令及其参数,我还能够读取Path环境变量以获取所有路径的目录。现在,我必须查看这些目录以找到文件(命令)所在的位置,然后返回完整的路径,以便将其发送到execve以在子进程中执行 我必须创建一个查找函数,它接受参数数组(第0个索引位置包含命令名)和目录数组 下面是提供给我们的
我已经能够解析字符串,获取命令及其参数,我还能够读取Path环境变量以获取所有路径的目录。现在,我必须查看这些目录以找到文件(命令)所在的位置,然后返回完整的路径,以便将其发送到execve以在子进程中执行 我必须创建一个查找函数,它接受参数数组(第0个索引位置包含命令名)和目录数组 下面是提供给我们的功能的概要
// Search the directories identified by the dir argument to see
// if the argv[0] (the filename) appears there. Allocate a new
// string, place the full path name in it, then return the string.
//
char* lookupPath(char **argv, char **dir){
char* result;
char pName[MAX_PATH_LEN];
// check if is already an absolute path name
if( *argv[0] == '/' ) .....
// look in PATH directories, use access() to see if the
// file is in the dir
for( i = 0 ; i < MAX_PATHS ; i++ ) .....
// File name not found in any path variable
fprintf(stderr, "%s: command not found\n", argv[0]);
return NULL;
}
//搜索由dir参数标识的目录以查看
//如果argv[0](文件名)出现在那里。分配一个新的
//字符串,将完整路径名放入其中,然后返回字符串。
//
char*lookupPath(char**argv,char**dir){
字符*结果;
char pName[最大路径长度];
//检查是否已经是绝对路径名
如果(*argv[0]='/')。。。。。
//在路径目录中查找,使用access()查看
//文件在目录中
对于(i=0;i
这里argv是参数数组(第0个索引包含命令,以下索引包含参数)
和dir[]包含所有目录的数组
现在我想如何遍历这些目录来找到give命令的完整路径 这可能比我应该提供的要多,但还有足够多的东西,你需要弄清楚这不是扣篮
#include <unistd.h>
typedef std::vector<std::string> pathArray;
std::string lookupPath(const std::string pgm, pathArray &paths)
{
int ret;
for (int i = 0; i < paths.size(); ++i)
{
std::string temp = paths[i];
temp = temp + "/" + pgm;
// let execv determine if it is executable
// or you can do that here if required
if ((ret = access(temp.c_str(), F_OK)) == 0)
return temp;
}
return("");
}
int main(int argc, char *argv[])
{
pathArray pa;
pa.push_back("/bin");
pa.push_back("/usr/bin"); //and the rest of PATH contents
std::string pgm;
std::string fullpath;
pgm = "ls";
if ((fullpath = lookupPath(pgm, pa)) != "")
{
//execv(fullpath.c_str(), ....);
//etc...
}
else
{ //could not find pgm
}
return(0);
}
#包括
typedef std::向量路径数组;
std::string lookupPath(常量std::string pgm、路径数组和路径)
{
int ret;
对于(int i=0;i 你应该使用C还是C++?你的代码错了,但是你必须想一想。假设您已经将路径解析为每个路径,每个路径由冒号分隔为一个字符串数组(如果是c++,则为向量)。您正在将该数组和程序名传递到函数中,以便将pgm名称连接到每个路径上,然后使用access
查看文件是否存在(请注意您的访问权限)。你找到的第一个文件就是你想要的,否则如果找不到文件就是错误的。@Duck你基本上知道我要做什么,但是你能帮我完成吗,我以前没有使用access,我也不知道如何解析每个目录并查找程序一些链接或一个小代码片段,这些链接或代码片段可以告诉我如何基本上做到这一点,这将非常有用help@CareyGregory我们可以使用C或C++,我们已经通过整个课程教了C++,所以我们更喜欢C++,我们的教授给了我们C中的帮助代码。基本上,程序已经变成C和C++的混合体,我知道这不是非常有效,而且是正确的,但是由于时间的缺乏,我不能把它全部转换成C++或者CI中的任何代码都认为你的教授犯了一个错误。我认为人们应该学习C++和C++第二。伟大的D这是一个很小的问题,比如根据文件,我们不仅仅要考虑给定的完整路径,我们首先要查看第一个目录,如果没有找到,然后深入到,比如/Urr/bin,所以首先要查看UR,如果没有找到,那么进入usr/bin,所以我想最简单的方法是解析路径字符串,并根据“/”和行if((ret=access(temp.c_str(),F_OK))==0)将其分解为子字符串,如果((ret=access(temp.c_str(),F_OK))=0)确定路径中存在文件,那么shell路径搜索就不是这样工作的。关键是让用户根据路径字符串中的第一个来确定搜索路径的顺序。但如果这是任务,那么,是的,这样做,但在现实世界中,它可能会破坏东西。是的,好的,检查存在。根据您的任务,您可能需要X_OK或其他权限组合。我会让你去弄清楚的。我只想说,非常感谢,这是我一直坚持的部分,在清理完这个之后,我又花了2个小时左右的时间完成了整个工作,现在我的CLI工作得很好:D非常感谢兄弟