2016-04-30 27 views
1
#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <sys/ipc.h> 
#include <sys/wait.h> 
#include <sys/shm.h> 
int main() { 
     int i=0; 
     int shmid; 
     int *mem=(int*)malloc(10*sizeof(int)); 
     key_t key; 
     key=1234; 
     pid_t pid; 

     shmid=shmget(1234,sizeof(*mem), IPC_CREAT|0666); 
     if(shmid==-1) { 
      printf("shmget error\n"); 
      return -1; 
     } 
     mem=shmat(shmid, NULL, 0); 

     if(mem==(int*)-1) { 
       printf("shmat error\n"); 
       return -1; 
     } 

     for(;i<10;i++) { 
       *(mem+i)=0; 
     } 

     pid=fork(); 

     if(pid<0) { 
       fprintf(stderr,"Fork Failed"); 
       printf("array : "); 
     } 
     else if (pid==0) { 
       printf("producer is created.\n"); 
       printf("array : "); 

       for(i=0;i<10;i++) { 
         printf("%d ", *(mem+i)); 
       } 
       printf("\n"); 
       for(i=0;i<10;i++) { 
         *(mem+i)=i+1; 
       } 
     } 
     else { 
       wait(NULL); 
       printf("consumer takes control of array.\n"); 
       printf("array : "); 
       for(i=0;i<10;i++) { 
         printf("%d ", *(mem+i)); 
       } 
       printf("\n"); 
       printf("consumer is done.\n"); 
       printf("array : "); 
       for(i=0;i<10;i++) { 
          *(mem+i)=-1; 
          printf("%d ", *(mem+i)); 
       } 
       printf("\ndone."); 
     } 
     free(mem); 
     return 0; 
}    

父進程和子進程共享一個數組。所以我決定在這些進程之間共享內存。但是,shmget函數失敗,這意味着如果我運行該程序,打印值是shmget錯誤。我不知道問題是什麼。我嘗試過靜態分配數組,動態分配數組等。問題是什麼?我使用Cygwin。shmget不工作

+1

你確實是知道'的sizeof(* MEM)'給** **一個'int'的大小? –

+0

我覺得這一點很奇怪,所以我改變了我的代碼shmget(key,100,IPC_CREAT | 0666);代替。但仍然有錯誤信息 –

+0

這個調用'mem = shmat(shmid,NULL,0);'泄漏內存分配在這裏:'int * mem =(int *)malloc(10 * sizeof(int));'。 – alk

回答