2017-06-16 64 views
0

我应该写一个程序,将整数写入共享内存,fork一个子进程,子进程应读取整数。C共享内存只在分叉进程1024 int

shm.c

#define N_SHARED 2000 

int main(int argc, char **argv) { 
/* Ein Shared-Memory-Segment einrichten */ 
shmid = shmget(IPC_PRIVATE, N_SHARED, IPC_CREAT | SHM_R | SHM_W); 

if (shmid == -1) { 
perror("shmid"); 
exit(1); 
} 

/* Pointer zu Sharedm-Memory-Segment erhalten */ 
shmData = (int *)shmat(shmid,0, N_SHARED); 
if (shmData == (int *)(-1)) { 
    perror("shmat"); 
    exit(1); 
} 

/** ininitalisieren des Zufallsgenerator durch aktuellen Zeitstempel */ 
srand48(time(NULL)); 
for (i=0; i<N_SHARED; i++) { 
shmData[i] = lrand48(); 
printf("SHM-->%d-->%d\n",i+1,shmData[i]); 
} 

    pid = fork(); 

    snprintf(shmidArg,32, "%d", shmid); 

    // Kindprozess 
    if (pid == 0) { 
    execlp("./shm_child",shmidArg,NULL); 
    } else if (pid < 0) { 
     perror("Kindprozess konnte nicht erzeugt werden!"); 
     return 1; 
    } 

shm_child.c

#define N_SHARED 2000 

    int i; 
    int *shmData; 
    static int shmid; 

    int main(int argc, char **argv) { 
    shmid = atoi(argv[0]); 
    printf("shm_child shared memoryid:%d\n",shmid); 

    /* Shared-Memory laden */ 
    shmData = (int *)shmat(shmid,0,0); 
    if (shmData == (int *)(-1)) { 
     perror("shmat"); 
     exit(1); 
    } 


    for(i=0;i<N_SHARED;i++) { 
     printf("%d --> %d\n",i+1,shmData[i]); 
    } 

我的问题:该指数1024后都数为0的child_process但不是在主进程。

谢谢

+2

我认为你没有指定在父进程中使用函数shmget创建的共享内存的正确大小。这个函数的第二个参数应该是'N_SHARED * sizeof(int)'。 '的shmid = shmget的(IPC_PRIVATE,N_SHARED *的sizeof(int)的,IPC_CREAT | SHM_R | SHM_W);' – shamba

+0

的第三个参数'的shmat()'是一个标志位掩码,而是你似乎是传递的大小(这是一个共享内存段的固有特性)。这是错误的,尽管目前还不清楚它是否解释了你的问题。 –

+0

@shamba这是问题所在。非常感谢你 ! – Ezak

回答

2

我相信,如果你改变#define N_SHARED 2000#define N_SHARED 2000*sizeof(int),你的代码应该按预期工作。

shmat分配共享内存的大小等于取值为PAGE_SIZE倍数的大小。您的代码尝试分配2000个字节,四舍五入为4096,即1024 * sizeof(int)。这解释了为什么前1024个int具有预期值。