用c中的execve调用mkdir系统调用

时间:2012-10-03 00:59:27

标签: c shell exec

我是C的新手,我在OS类中,我需要在C(yay)中编写基本shell。它实际上已经过了一半,我只是想在完成工作的同时学习C语言。

我试图在分叉后使用exec,现在调用mkdir。这个论点需要我一点点,但我一直想弄清楚,并希望有人能告诉我哪里出错了。

            } else {
            //fork exec
            int pid = fork();
            if (pid == 0) {
                printf("%s",my_argv[0]);
                execve("/bin/mkdir",my_argv,0);
            } else wait(NULL);
        }

这是我响应mkdir调用的部分。现在,我有一个从用户输入的行[],命令是用

command = strtok(line, DELIMITERS);

arg是:

arg = strtok(0,DELIMITERS);
        my_argv[0] = arg;

一切都很好,但mkdir永远不会有效。打印my_argv [0]给出了我期望的正确参数。我确信这是愚蠢的,但任何提示都会受到赞赏。

所有代码:

int main(int argc, char *argv[])
{
char *command;
char line[MAXLINE];
char *arg = NULL;
char *my_argv[]; 


while(1) {
    printf(PROMPT);
    if (fgets(line,MAXLINE,stdin) != NULL) {
        //take out \n
        line[strlen(line)-1] = '\0';
    }
    //looks for first delimiter, saves as the command
    command = strtok(line, DELIMITERS);


    //start looking at what command it is by comparing
    if (strcmp(command,"cd")==0) {
        //if they equal zero, they match
        //this is a cd command, must have following arg
        if (argv[1] == NULL) chdir("/");
        else chdir(argv[1]);//chdir is the system call for cd
    } else if (strcmp(command,"exit")==0) {
        break;
    } else if (strcmp(command,"mkdir")==0){
        arg = strtok(0,DELIMITERS);
        my_argv[0] = arg;
        my_argv[1] = NULL;
        if (!arg) {
            printf("Usage: mkdir missing arg\n");
        } else {
            //fork exec
            int pid = fork();
            if (pid == 0) {
                printf("%s",my_argv[0]);
                //mkdir(arg);
                             execve("/bin/mkdir",my_argv,0);
            } else wait(NULL);
        }
    }


}
return 0;
}

2 个答案:

答案 0 :(得分:5)

  • argv[0]包含程序名称
  • argv[1]是第一个参数
  • 参数列表必须以NULL结尾

答案 1 :(得分:1)

您可以使用mkdir系统调用来代替execve