【问题标题】:Call mkdir syscall with execve in C在 C 中使用 execve 调用 mkdir 系统调用
【发布时间】:2012-09-23 21:56:36
【问题描述】:

我对 C 非常陌生,并且在一个 OS 课程中,我需要用 C 编写一个基本的 shell(耶)。它实际上已经完成了一半,我只是想在完成工作的同时学习 C 基础知识。

我正在尝试在 fork 和调用 mkdir 之后使用 exec。争论需要通过我一点点,但我一直在试图弄清楚,并希望有人能告诉我哪里出错了。

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

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

command = strtok(line, DELIMITERS);

参数是:

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

【问题讨论】:

  • 注意,有一个mkdir function。您真的不必为此执行整个其他程序。
  • 是的,我希望就这么简单
  • 您是否有不能使用mkdir 功能的原因,或者这是作业的要求?
  • 作业要求

标签: c shell exec


【解决方案1】:
  • argv[0] 包含程序的名称
  • argv[1] 是第一个参数
  • 参数列表必须以 NULL 结尾

【讨论】:

  • 我输入 my_argv[1] = NULL 并尝试“mkdir test”并返回 test:missing 操作数。我还要确保我在同一个目录中 XD
  • 我不知道,因为当我打印 argv[0] 时,我得到了我正在寻找的论点。所以输入是 mkdir testFolder 和 argv[0] 是 testFolder
  • 正如@KarolyHorvath 告诉你的,argv[1] 必须是程序的参数; argv[0] 只包含要执行的程序的名称(这里是"mkdir")。
  • 那么为什么 argv[0] 会打印附加参数呢?我有一个不打印 mkdir 的 printf 语句,只是附加的 arg
  • 程序调用自己argv[0](通常的技巧,它更灵活),并抱怨它缺少操作数(目录的名称)
【解决方案2】:

您可以使用mkdir 系统调用而不是execve

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-10
    • 2015-03-23
    • 1970-01-01
    • 2016-02-09
    • 1970-01-01
    • 2011-01-21
    相关资源
    最近更新 更多