Почему дочерний процесс здесь ничего не печатает? - PullRequest
0 голосов
/ 28 февраля 2009

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

// 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

Ответы [ 3 ]

10 голосов
/ 28 февраля 2009

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

3 голосов
/ 28 февраля 2009

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

fprintf(stderr,"Plop\n");

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

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

0 голосов
/ 28 февраля 2009

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

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

...