2016-04-30 1 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; 
}    

Le processus parent et le processus enfant partagent un tableau. Je décide donc de partager la mémoire entre ces processus. Cependant, la fonction shmget échoue, ce qui signifie que si je lance le programme, la valeur d'impression est une erreur shmget. Je ne sais pas quel est le problème. J'ai essayé l'allocation statique de tableau, allocation dynamique de tableau, etc. Quel est le problème? J'utilise Cygwin.shmget ne fonctionne pas

+1

Vous * ne * savent que 'sizeof (* mem)' donne la taille de ** un ** 'int'? –

+0

J'ai senti que ce point est étrange, donc j'ai changé mon code shmget (clé, 100, IPC_CREAT | 0666); au lieu. mais il a toujours un message d'erreur –

+0

Cet appel 'mem = shmat (shmid, NULL, 0);' fuit la mémoire allouer ici: 'int * mem = (int *) malloc (10 * sizeof (int));'. – alk

Répondre