C 获取和设置路径
我一直在编写一个简单的shell,我已经设法获得了一些真正基本的功能,但是在其中一个阶段,它要求我获取和设置环境。这是任务的细节 第4阶段:获取和设置路径–10分 保持原有路径 之所以有必要这样做,是因为我们希望将路径恢复到最初退出shell时的路径。这一点很重要,因为对shell环境所做的任何更改(即上面的setenv()函数)不仅会影响shell本身,还会影响以后将从同一终端执行的任何其他程序。出于这个原因,将事情恢复到退出时的状态是一个好主意 一个字符串就足以保持原始路径 保存路径应该是shell启动时所做的第一件事 打印和更改路径–内置命令 从C程序中,我们可以使用getenv()函数访问环境,也可以使用setenv()函数更改环境。如果查看setenv()的手册页面,您将发现它是如何工作的(即所需参数和返回值),以及使用它需要包括哪些内容 getpath–打印系统路径和设置路径–设置系统路径 这两个命令是关于环境参数路径的。第一种方法只是获取并打印其值,而第二种方法将路径(以冒号分隔的目录列表的字符串)作为参数,并将其作为path的值。为此,可以分别使用getenv()和setenv() 还原路径 您只需将PATH环境参数更改为其原始值(即启动shell时保存的值) 恢复路径应该是shell退出之前所做的最后一件事 第4阶段:测试 首先,确保为第3阶段执行的所有测试仍然有效。但是要小心,因为我们现在正在更改路径,这将影响外部程序的执行 要检查附加功能,首先应检查路径的保存和恢复是否正常。这里的一个好主意是在shell执行开始时保存路径,然后在结束时退出时再次打印路径。在这两种情况下,打印路径应该完全相同 接下来,您应该检查在调用getpath时是否打印当前路径,该路径应该与原始路径相同 然后,您应该专注于测试setpath。首先,将路径设置为一个新值,并测试getpath是否打印它,然后尝试查看更改路径对外部命令执行的影响(例如,将路径设置为仅“.”,然后尝试“ls”或尝试shell本身,等等) 这是我的代码:C 获取和设置路径,c,shell,path,get,set,C,Shell,Path,Get,Set,我一直在编写一个简单的shell,我已经设法获得了一些真正基本的功能,但是在其中一个阶段,它要求我获取和设置环境。这是任务的细节 第4阶段:获取和设置路径–10分 保持原有路径 之所以有必要这样做,是因为我们希望将路径恢复到最初退出shell时的路径。这一点很重要,因为对shell环境所做的任何更改(即上面的setenv()函数)不仅会影响shell本身,还会影响以后将从同一终端执行的任何其他程序。出于这个原因,将事情恢复到退出时的状态是一个好主意 一个字符串就足以保持原始路径 保存路径应该是s
/* S.NO:201148541 Simple Shell Example
Completed upto Stage 3 */
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#define BUFFER_SIZE 1<<16
#define ARR_SIZE 1<<16
void parse_args(char *buffer, char** args,
size_t args_size, size_t *nargs)
{
char *buf_args[args_size];
char **cp;
char *wbuf;
size_t i, j;
wbuf=buffer;
buf_args[0]=buffer;
args[0] =buffer;
for(cp=buf_args; (*cp=strsep(&wbuf, " \n\t")) != NULL ;){
if ((*cp != '\0') && (++cp >= &buf_args[args_size]))
break;
}
for (j=i=0; buf_args[i]!=NULL; i++){
if(strlen(buf_args[i])>0)
args[j++]=buf_args[i];
}
*nargs=j;
args[j]=NULL;
}
int main(int argc, char *argv[], char *envp[]){
char buffer[BUFFER_SIZE];
char *args[ARR_SIZE];
int *ret_status;
size_t nargs;
pid_t pid;
char curDir[100];
while(1){
getcwd(curDir, 100);
printf("%s->", curDir);
fgets(buffer, BUFFER_SIZE, stdin);
parse_args(buffer, args, ARR_SIZE, &nargs);
if (nargs==0) continue;
if(strcmp(args[0], "cd") == 0){
chdir(args[1]);
}
else if (!strcmp(args[0], "exit" )) exit(0);
pid = fork();
if (pid){
pid = wait(ret_status);
printf("finished\n", pid);
}
else {
if( execvp(args[0], args)) {
puts(strerror(errno));
exit(127);
}
}
}
}
return 0;
}
/*S.NO:201148541简单外壳示例
完成至第3阶段*/
#包括
#包括
#包括
#包括
#包括
#包括
#定义缓冲区大小1,因为我们不知道您前面的步骤是什么,并且按照建议执行
然后,您应该专注于测试setpath。首先,将路径设置为
新值并测试getpath是否打印它,然后尝试查看如何打印
更改路径确实会影响外部命令的执行
(例如,将路径设置为仅“.”,然后尝试“ls”或尝试shell本身,
等等)
你可以这样做
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char *path, *old, *tobeSet;
path = malloc(1024);
path = getenv("PATH");
old = malloc(strlen(path));
tobeSet = malloc(10); // just to be safe
strcpy(tobeSet,".");
if(setenv("PATH",tobeSet,1)!=0)
{
printf("Couldn't set path\n");
return 0;
}
printf("\nPATH::\t%s\n",path);
printf("\n\nNewPath::\t%s\n",tobeSet);
if(setenv("PATH",path,1)!=0)
{
printf("Couldn't restore path\n");
return 0;
}
printf("\n\nOld path ::\t%s\n",path);
free(path);
free(old);
free(tobeSet);
return 0;
}
#包括
#包括
#包括
int main()
{
char*path,*old,*tobeSet;
path=malloc(1024);
path=getenv(“path”);
old=malloc(strlen(path));
tobeSet=malloc(10);//为了安全起见
strcpy(托贝斯特,“.”);
if(setenv(“PATH”,tobeSet,1)!=0)
{
printf(“无法设置路径\n”);
返回0;
}
printf(“\n路径::\t%s\n”,路径);
printf(“\n\n路径::\t%s\n”,待设置);
如果(setenv(“路径”,路径,1)!=0)
{
printf(“无法还原路径\n”);
返回0;
}
printf(“\n\nOld路径::\t%s\n”,路径);
自由(路径);
免费(旧);
免费(托贝赛);
返回0;
}
你能说得更具体些吗?你的问题是什么?我试图实现两个函数以获得环境路径并设置环境,我真的不确定应该如何进行,从我的任务中可以看出,使用getenv和setenv函数我可以做到这一点,但是我不确定如何启动。例如,它是否只是我编写的一个函数,然后在用户输入端获取特定输入时调用它?(就像我对exit和cd命令所做的那样)该代码段是由您编写的还是在作业中给出的?它不包含任何路径设置代码!