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
4

3 回答 3

12

C 标准输出流在内部缓冲数据。很可能您的“这是孩子”消息正在被缓冲,而缓冲区没有被 execlp 刷新,所以它就消失了。fflush(stdout);在 printf 之后尝试一个。顺便说一句,您也应该在 the 之前执行此操作fork(),这样子级和父级就不会都尝试写入从 fork 之前缓冲的输出。

于 2009-02-28T01:35:22.163 回答
3

打印到 stderr 它没有被缓冲。

fprintf(stderr,"Plop\n");

共享内存的东西(segment_id,shared_memory)也没有在父级中初始化(或者如果是,那么它与子级不同)。

此外,当孩子仍在处理时,父母可能会破坏共享内存的东西。父母应该先等待,然后再处理孩子产生的数据。

于 2009-02-28T01:50:02.767 回答
-1

首先摆脱所有共享内存的东西,然后看看子进程是否可以成功地 printf 。

通过该片段的外观,您正在子进程中初始化 shared_memory ,而不是在父进程中。

于 2009-02-28T01:38:10.817 回答