1

分岐する関数に変数を渡そうとしていますが、ほとんどが機能しているようですが、前に宣言されていない argv[5] に渡そうとしている ID をそれぞれに与える必要があります。コードでセグメント フォールトが発生し続け、その理由がわかりません。何か案は?

主要

char* arg_list_consumer[] = {
        "./consume",
        argv[1], 
        argv[2],
        NULL
    };
    char* arg_list_producer[] = {
        "./produce",
        argv[1], 
        argv[2],
        argv[3],
        argv[4],
        argv[5],
        NULL
    };
   if (getppid()==1){
        producerID=0;
   }
   if(producerID==0){
        for(i=1; i<P; i++){
            sprintf(arg_list_producer[5], "%d", i);
            spawn ("./produce", arg_list_producer);
        }
        for(i=0; i<C; i++){
            sprintf(arg_list_consumer[5], "%d", i);
            spawn ("./consume", arg_list_consumer);
        }
    }

スポーン

int spawn (char* program, char** arg_list)
{
  pid_t child_pid;
  /* Duplicate this process.  */
  child_pid = fork();

  if (child_pid != 0)
    /* This is the parent process.  */
    return child_pid;
  else {
    /* Now execute PROGRAM, searching for it in the path.  */
    execvp (program, arg_list);
    /* The execvp function returns only if an error occurs.  */
    fprintf (stderr, "an error occurred in execvp\n");
    abort ();
  }
}
4

1 に答える 1

1

arg_list_consumer は、4 つのエントリのみを持つように宣言されています。したがって、[5] でインデックスを作成するのは無効なメモリ操作です。

arg_list_consumer[5] に値を割り当てたい場合は、配列が少なくともサイズ 6 のポインターであることを宣言する必要があります (または、さらにいくつかの NULL をスローして、サイズが少なくとも 6 ポインターになるようにすることができます)。

次に、sprintf を使用して何かを保存する場合は、宛先文字列に既にスペースが割り当てられている必要があります。ポインターの配列しかないので、これは malloc を使用してスペースを割り当てる必要があることを意味します。

arg_list_consumer[5] = malloc(sizeof(char)*10);
sprintf(arg_list_consume[5], "%d", i);

(私は 10 を使用しましたが、明らかに必要と思われる長さを使用する必要があります)。

于 2013-12-01T00:26:26.763 に答える