我正在尝试创建一个小程序,该程序创建两个儿子(proccess),每个儿子生成随机数。父亲等待儿子们总结结果。
问题:要使其正常工作,我需要做哪些修改?

这是我到目前为止所做的。

#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>

#define SEGSIZE 100

void main()
{
    key_t key;
    int   shmid;
    char  *segptr;
    int status=0;
    int r_pid=1;
    int r_pid2=1;
    key = ftok(".", 'T');
    if((shmid = shmget(key, SEGSIZE,IPC_CREAT|IPC_EXCL|0666))== -1)
    {
        printf("Shared memory segment exists - opening as client\n");
        if((shmid = shmget(key, SEGSIZE, 0)) == -1)
        {
            perror(" bad shmget");
            exit(1);
        }

    }
    else
    {
        printf("Creating new shared memory segment\n");
    }
    if((segptr = shmat(shmid, 0, 0)) == NULL)
    {
            perror("shmat");
            exit(1);
    }
    r_pid=fork();
    if(r_pid!=0)
            r_pid2=fork();

    if(r_pid<0 || r_pid2<0 )
    {
            printf("No child created");
            exit(1);
    }
    if(r_pid==0  )
    {
            printf("The child process with PID number : %d"" (his parent PID is %d) writes a text to the shared"" memory\n",getpid(),getppid());
            strcpy(segptr,"12");
    }
    else if(r_pid2==0)
    {
        segptr+=2;
        printf("The child process with PID number : %d" " (his parent PID is %d) writes a text to the shared"" memory\n",getpid(),getppid());
        strcat(segptr,"14");
    }
    else
    {
        r_pid = wait(&status);
        r_pid2 = wait(&status);
        printf(" The following text is received by the ""parent process with PID number pid: %d  pid2 : %d  text: %s\n",r_pid,r_pid2,segptr);


    }

    shmctl(shmid, IPC_RMID, 0);

}


欢迎提出建议!谢谢。
编辑
这是一些更新:
如果我使用无用字符初始化segptr,例如:strpy(segptr,“ a”)
然后在儿子中我做strcat(segptr,“ test1”),在r_pid2中我做strcat(segptr,“ test2”)
父亲将打印test1test2,反之亦然。

最佳答案

不能保证第一个孩子在第二个孩子之前跑。所以

        segptr+=2;
        …
        strcat(segptr,"14");


可能在执行之前

            strcpy(segptr,"12");


使第一个数字“ 14”被终止的空字符“ 12”覆盖。


  我需要做哪些修改才能使其正常工作?


确保写不重叠,例如。 G。通过改变

            strcpy(segptr,"12");




        strncpy(segptr, "12", 2);

10-06 11:09