与分叉过程混淆?

时间:2015-12-07 08:13:13

标签: c multiprocessing

我正在尝试做第一个子函数,例如,打印出一个字符串:hello!,然后返回父进程。然后,我为第二个子函数分配了另一个进程,它将计算共享内存号。我想只有一个"所有完成"到底,但它显示了两个?谢谢你的帮助!

hello

1 个答案:

答案 0 :(得分:0)

在第一部分中添加退出(0)之后,我在最后一部分只获得一个“全部完成”,这就是我想要的答案。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/shm.h>
#include <string.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <errno.h>
#include <sys/wait.h>
#include <fcntl.h>

#define NUM_LINES 5

char * shm;

void child_func(char *shm)
{ 
        while (atoi(shm) != NUM_LINES)
        {
            // P(sem);
            printf("now reading word:%d\n", atoi(shm) );
            *shm+=1;
            // V(sem);
        }

        exit(0);
}

void parent_func(pid_t pid)
{
    int status;
    pid_t pid_wait;
    do
    {
        pid_wait = waitpid(pid, &status, WNOHANG);
    }while (pid_wait != pid);
    // printf("Process %d done\n", getppid());
}

int main(int argc, char const *argv[])
{
    /* declarations */
    pid_t pid[8]; 
    int ret, shmid, status,corpse, i, ave, n;
    char fn[20];
    key_t key = 123;
    char *string_back;

    /* create share memory */
    if ((shmid = shmget(key, SHMSIZE, IPC_CREAT|666)) <0)
    {
        perror("shmget");
        exit(1);
    }
    /* attach shm */
    if ((shm = shmat(shmid, NULL, 0)) == (char*)-1)
    {
        perror("shmat");
        exit(1);
    }
    /* init shm value */
    *shm = '0';

    /* input */
    printf("please enter n:\n");
    scanf("%d", &n);

    /*  section 1  */
        pid[0] = fork();
        if (pid[0] == 0) // child processes
        {
            printf("hello !\n");
            /* problem solved here */
            exit(0);
        }
        else if (pid[0] >0)
        {
            parent_func(pid[0]);
        }

    /*  section 2 */
    for (i=0;i<n;i++)
    {
        pid[i] = fork();
        if (pid[i] == 0) // child processes
        {
                child_func(shm);
        }
        else if (pid[i] >0)
        {
            parent_func(pid[i]);
        }
    }

    printf("all done\n");
    /* detach shm */
    shmdt(shm);
    /* destroy shm */
    int retval = shmctl(shmid, IPC_RMID, NULL);
    if (retval < 0) perror("remove shm");

    return 0;
}