共享内存 - 儿子生成数字和父亲求和结果[UNIX]

时间:2014-12-04 16:52:42

标签: c unix process shared-memory

我正在尝试创建一个创建两个儿子(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,&#34; a&#34;)
然后在儿子中我做了strcat(segptr,&#34; test1&#34;)而在r_pid2中我做了strcat(segptr,&#34; test2&#34;)
父亲将打印test1test2,反之亦然。

1 个答案:

答案 0 :(得分:0)

无法保证第一个孩子在第二个孩子之前跑步。那么,

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

可以在

之前执行
            strcpy(segptr,"12");

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

  

为了使其有效,我需要做些哪些修改?

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

            strcpy(segptr,"12");

        strncpy(segptr, "12", 2);