gpt4 book ai didi

c - 获取和设置路径

转载 作者:行者123 更新时间:2023-11-30 19:22:28 24 4
gpt4 key购买 nike

我一直在负责编写一个简单的 shell,我已经设法获得了一些非常基本的功能,但是对于其中一个阶段,它要求我获取并设置环境。这是任务的详细内容。

第 4 阶段:获取和设置路径 – 10 分

保留原来的路径

之所以需要这样做,是因为我们希望将路径恢复到最初退出 shell 时的路径。这很重要,因为对 shell 环境(即上面的 setenv() 函数)所做的任何更改不仅会影响 shell 本身,还会影响随后从同一终端执行的任何其他程序。因此,最好将事情恢复到退出时的状态。

单个字符串足以保留原始路径。

保存路径应该是 shell 启动时所做的第一件事。

打印和更改路径 - 内置命令

在 C 程序中,我们可以使用 getenv() 函数访问环境,并且可以使用 setenv() 函数更改环境。如果您查看 setenv() 的手册页,您会发现它是如何工作的(即所需的参数和返回值)以及使用它时需要包含的内容。

getpath – 打印系统路径 & setpath – 设置系统路径

这两条命令是关于环境参数PATH的。第一个只是获取并打印它的值,而第二个则采用路径(冒号分隔的目录列表字符串)作为参数,并将其设置为 PATH 的值。您可以分别使用 getenv() 和 setenv() 来实现此目的。

恢复路径

您只需将 PATH 环境参数更改为其原始值(即您在 shell 启动时保存的值)。

恢复路径应该是 shell 退出前执行的最后一件事。

第四阶段:测试

首先,确保您在第 3 阶段进行的所有测试仍然有效。但要小心,因为我们现在正在更改路径,这将影响外部程序的执行。

要检查附加功能,您应该首先检查路径的保存和恢复是否有效。这里的一个好主意是在 shell 执行开始时保存路径时打印路径,然后在结束时退出时再次打印路径。在这两种情况下,打印的路径应该完全相同!

接下来,您应该检查调用 getpath 时是否打印当前路径,该路径应该与原始路径相同。

那么你应该专注于测试 setpath。首先,将路径设置为新值并测试 getpath 是否打印它,然后尝试查看更改路径如何真正影响外部命令的执行(例如,将路径仅设置为“.”并尝试“ls”或尝试shell 本身等)。

这是我的代码:

/* 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;
}

我真的很茫然,任何指导都会有帮助。

最佳答案

鉴于我们不知道您之前的步骤是什么,因此按照建议进行

Then you should focus on testing setpath. First, setpath the path to a new value and test that getpath prints it, then try also to see how changing the path really affects the execution of external commands (e.g. set the path to only ‘.’ and try ‘ls’ or try the shell itself, etc).

你可以这样做...

#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;
}

关于c - 获取和设置路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16163521/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com