1

私はこの単純なLinuxシェルで何時間も苦労してきましたが、何らかの理由で最も基本的なものを正しく機能させることができません。このシェルが機能しない例の1つは、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 に答える