2016-04-30 5 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関数は失敗します。つまり、プログラムを実行すると、print値はshmgetエラーです。私は問題が何であるか分からない。私は配列の静的割り当て、配列の動的割り当てなどを試みました。何が問題なのですか?私はCygwinを使用します。​​からshmgetは機能しません。

+1

あなたは* * 'はsizeof(* MEM)は' ** 1 ** 'int'の大きさを与えることを知っていますか? –

+0

私はその点が奇妙だと感じたので、コードshmget(key、100、IPC_CREAT | 0666)を変更しました。代わりに。それでもまだエラーメッセージが表示されています –

+0

この呼び出しは 'mem = shmat(shmid、NULL、0);'メモリをここにリークします: 'int * mem =(int *)malloc(10 * sizeof(int));'。 – alk

答えて

2

:Cygserverのが実行されている場合

XSI IPC関数はSEMCTL、semgetから、semopから、にshmat、shmctl、にshmdt、たshmget、はmsgctl、msgget、のmsgrcvとにmsgsndにのみ使用可能です。

ここCygserverの上

より:https://cygwin.com/cygwin-ug-net/using-cygserver.html

関連する問題