获取和设置路径

时间:2013-04-23 07:32:51

标签: c shell path get set

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

阶段4:获取和设置路径 - 10个标记

保持原始路径

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

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

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

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

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

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

这两个命令是关于环境参数PATH的。第一个只获取并打印其值,而第二个获取路径(冒号分隔的目录列表)作为参数,并使其成为PATH的值。为此,你可以分别使用getenv()和setenv()。

恢复路径

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

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

第4阶段:测试

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

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

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

然后你应该专注于测试setpath。首先,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;
}

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

1 个答案:

答案 0 :(得分:1)

鉴于我们不知道您之前的步骤是什么,并且遵循建议

  

然后你应该专注于测试setpath。首先,setpath路径为a   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;
}