2009-02-28 2 views
0

Предположим, что все переменные были объявлены ранее ... потому что они были. Детский процесс не печатает ничего, что заставляет меня думать, что оно не выполняется. Родительский процесс работает нормально, хотя он не получает разделяемую память. Извиняюсь за длину этого кода ...Почему ребенок здесь не печатает ничего?

// create 5 child process 
for(int k=0;k<5;k++){ 

    // fork a child process 
    pid = fork(); 

    // error occured on fork 
    if (pid < 0) { 
     fprintf(stderr, "Fork Failed"); 
     return 1; 
    } 
    // this is what the child process will run 
    else if (pid == 0) { 
     //create a shared mem segment 
     segment_id = shmget(IPC_PRIVATE, size, S_IRUSR | S_IWUSR); 

     //attach the shared memory segment 
     shared_memory = (char *) shmat(segment_id, NULL, 0); 

     printf("this is child"); 

     double x = 0; 
     double sum = 0; 

     // Run process that sums the function 
     for(int i=0; i<n; i++){ 
      // get random number in range of x1-x2 
      x = rand()%(x2 - x1 + 1) + x1; 
      sum = sum + f(x); 
     } 

     //write output to the shared memory segment 
     sprintf(shared_memory, "%f", sum); 
     execlp("/bin/ls", "ls", NULL); 

    } 

    // this is what the parent process will run 
    else { 

     //print output from shared memory 
     printf("\n*%s", shared_memory); 

     //detach shared memory 
     shmdt(shared_memory); 

     //Here we add the shared memory to the array 
     // To add together at the end 
     // but since I cant get the memory to share 
     // the array can't be implemented 

     //remove the shared memory segment 
     shmctl(segment_id, IPC_RMID, NULL); 

     wait(NULL); 
    } 
} // End of for statement 
+0

Вы не проверяете наличие каких-либо ошибок в операциях shm *. –

ответ

10

: C стандартный вывод поток внутренних буферов данных. Вероятно, ваше сообщение «это дочернее» буферизуется, и буфер не очищается execlp, поэтому он просто исчезает. Попробуйте fflush (stdout); после печатиf. Кстати, вы должны сделать это и перед fork(), чтобы ребенок и родитель не пытались писать вывод, буферизированный до вилки.

+0

Вероятно, это проблема, поскольку печатный результат не включает новую строку. Если выход был буферизирован, новая строка заставит данные появляться. –

+0

Кроме того, это хорошая причина для печати диагностики в stderr - она ​​не буферизована и не так легко теряется. –

+0

Я пробовал это, но это не работает для меня. Я использовал 'fflush (stdout);' но все же Child process ничего не печатал. Есть ли у нас какой-либо способ, с помощью которого мы можем обнаружить, что «которое в настоящее время выполняется (обслуживается процессором либо« ребенок », либо« родитель ») – Merom

-1

Сначала избавитесь от всего материала разделяемой памяти и проверьте, может ли дочерний процесс успешно выполнить печать.

При взгляде на этот фрагмент вы инициализируете shared_memory в дочернем процессе, но не в родительском процессе.

3

Печать в stderr не буферизирована.

fprintf(stderr,"Plop\n"); 

Также общий материал памяти (segment_id, shared_memory) не инициализируется в родительском (или, если это, то это не то же самое, как ребенок).

Кроме того, родитель потенциально уничтожает материал разделяемой памяти, пока ребенок все еще обрабатывает. Родитель должен сначала подождать, а затем обработать данные, созданные дочерним элементом.