3

私は C に非常に慣れておらず、C で基本的なシェルを作成する必要がある OS クラスにいます (yay)。それは実際にはきちんと中途半端に進んでいます.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 呼び出しに応答している部分です。現在、ユーザーから入力された 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;
}
4

2 に答える 2

5
  • argv[0]プログラムの名前が含まれています
  • argv[1]は最初の引数です
  • 引数リストは NULL で終了する必要があります
于 2012-10-03T01:04:57.770 に答える