2017-06-16 41 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具有預期值。