2013-12-01 7 views
1

Я пытаюсь передать переменные функции, которая вилки, большинство из них, похоже, работает, но мне нужно дать каждому идентификатор, который я пытаюсь передать в argv [5], который не объявляется ранее. Мой код продолжает сегрегацию, и я не могу понять, почему. Есть идеи?Пытаться передать переменные дочернему процессу

главный

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(); 
    } 
} 

ответ

1

arg_list_consumer объявляется только 4 записей. Таким образом, это недействительная операция памяти для индексации в нее с помощью [5].

Если вы хотите присвоить значение arg_list_consumer [5], вы должны объявить массив как минимум из указателей размера 6 (или вы можете добавить еще несколько NULL, чтобы иметь размер не менее 6 указатели).

Затем, если вы хотите использовать sprintf для хранения чего-то, у вас должно быть уже выделено пространство в целевой строке. Так как вы просто массив указателей, это означает, что вы должны использовать таНос выделить некоторое пространство:

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

(я использовал 10, но вы должны явно использовать любую длину вы считаете необходимым).