1

私の C プログラムでは、入力を解析して実行するために execvp コマンドを使用しています。私はこれを持っています:

char read_str[MAX_ALLOWED_BUFFER];
pid_t child_pid;
char *strs[100] = {NULL}; 

child_pid = fork();
if (child_pid == 0) {
    split(read_str, strs);
    execvp(strs[0], strs);
    printf("Failed\n");
}
else {
    waitpid(child_pid, NULL, 0);
    for (y = 0; y < 100; y++) free(strs[y]);
}

そしてこの機能

void split(char *str, char **splitstr) {      
    char *p;      
    int i=0;      
    p = strtok(str," "); 
    while(p!= NULL) {        
        splitstr[i] = malloc(strlen(p) + 1);
        if (splitstr[i]) strcpy(splitstr[i], p);
        i++;
        p = strtok(NULL, " ");       
    } 
}

最初のコード ブロックは while ループにあり、ユーザー入力を求め続けます。とにかく、execvp が返された場合、エラーが発生し、エラーが出力されます。さらに 2 つの有効なコマンドを入力すると、メモリ破損エラーが発生します...

ここで私が間違っていることを誰かが見ていますか?

4

1 に答える 1

0

ここで私が間違っていること

いくつかのこと。

  • execvp失敗すると、子は while ループの先頭に移動し、子と親の両方が入力を読み取っています。あなたがしたいことはexit(1)、印刷した後"Failed"です。
  • それを行った場合、は親に割り当てられることはなく、 dstrsである必要はありません。free()の定義を に移動することができ、strs何もif (child_pid == 0) {心配する必要はありませんfree

これは、次のようなメモリ破損の問題を説明していません。

  • 失敗すると、execvpC1が入力を読み取ったままになります。配列C1malloc()ed エントリがあります。strs
  • 入力sおよびs をC1取得します。次に、エントリを呼び出すと、それらはぶら下がります (それらを削除する必要があります)。fork()C2waitpidC1freestrsNULL
  • 再び入力s 、 s をC1取得し、同じエントリを再度呼び出すと、観察した二重および破損が発生します。forkC3waitpidfree strsfree
于 2013-01-20T03:02:44.173 に答える