1

几个小时以来,我一直在为这个简单的 linux shell 苦苦挣扎,但由于某种原因,我无法让最基本的东西正常工作。我处理输入或其他东西的方式严重搞砸了,因为这个 shell 不能工作的一个例子是 mkdir 命令。它不会随机创建一个我从未尝试创建的随机目录,并且每次我创建一个目录时,它都会设法创建一些其他具有随机名称的目录,我显然没有创建。有些事情搞砸了,我只是不知道,因为我一直在输出我的最终参数数组,从那里看起来很好。有人可以帮我看看这个。

#include<stdlib.h>
#include<stdio.h>
#include<sys/types.h>
#include<string.h>
#include<unistd.h>
#include<sys/wait.h>


int main(int argc, char *argv[]){
while(1){
    char line[100], *temp, *split[15];
    int child_id;
    printf("$ ");
    fgets(line, sizeof(line), stdin);
    line[strlen(line)-1] = '\0';

    temp = strtok(line, " ");
    int i = 0;
    while(temp != NULL){
        split[i] = temp;
        temp = strtok(NULL, " ");
        i++;
    }

    char *args[i];
    int j;
    for(j = 0; j < i; j++){
        args[j] = split[j];
        printf("%s\n", args[j]);
    }
    child_id = fork();
    if(child_id == 0){
        execvp(args[0], args);
        exit(0);
    }else{
        wait(&child_id);
    }


  }

}
4

1 回答 1

2

使用时execvp(),数组的最后一个元素args必须是NULL(这告诉内核命令行参数列表的结束位置)。

您应该可以通过split[i] = NULL;strtok()循环之后添加来做到这一点(哦,不需要args像上面评论中提到的那样将数组复制到,只需使用split)。

于 2012-10-07T21:33:24.280 回答