2012-11-05 37 views
0

我一直在努力信號量和共享內存一個星期了,並有一些困難,所以我試圖讓這個程序,其中的孩子應該寫入內存共享多維整數數組而父親則設想從共享內存中讀取該數組。Unix編程共享內存奇怪的結果

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <sys/ipc.h> 
#include <sys/shm.h> 
#include <stdio.h> 
#include <sys/fcntl.h> 
#include <semaphore.h> 
#include <sys/wait.h> 

#define MAXCHILDS 1 
#define MAX_SIZE 10 
#define MAX_WRITES 100 

typedef struct{ 
    int m[MAX_SIZE][MAX_SIZE]; 
}matrix; 


/*fork variables*/ 
pid_t child[MAXCHILDS]; 
/*semphores variables */ 
sem_t *empty, *full, * mutex; 
/*share memory id*/ 
int shmid; 
/*shared memory array pointer */ 
matrix * sh_mem; 




void init(){ 

    /*semaphores unlink and creation */  
    sem_unlink("EMPTY"); 
    empty=sem_open("EMPTY",O_CREAT|O_EXCL,0700,50); 
    sem_unlink("FULL"); 
    full=sem_open("FULL",O_CREAT|O_EXCL,0700,0); 
    sem_unlink("MUTEX"); 
    mutex=sem_open("MUTEX",O_CREAT|O_EXCL,0700,1); 
    /*initialize shared memory */ 
    shmid = shmget(IPC_PRIVATE,sizeof(matrix),IPC_CREAT|0777); 
    /*map shared memory*/ 
    sh_mem = (matrix*)shmat(shmid,NULL,0); 
    if(sh_mem == (matrix*)(-1)){ 
     perror("shmat"); 
    } 
} 

void writer(int m[MAX_SIZE][MAX_SIZE],int n_child){ 
    int i,k; 
    for(i = 0;i<MAX_SIZE;i++){ 
     for(k= 0;k<MAX_SIZE;k++){ 
      m[i][k] = 0; 
      if(i==(k+1)){ 
       m[i][k] = 1; 
      } 
     } 
    } 

} 
void reader(int m[MAX_SIZE][MAX_SIZE]){ 
    int i = 0; 
    int k = 0; 
    int sum = 0; 
    for(i = 0;i<MAX_SIZE;i++){ 
     for(k= 0;k<MAX_SIZE;k++){ 
      printf("%d",m[k][i]); 
     } 
     sum++; 
     printf("[i=]%d[k=]%d\n",i,k); 
    } 
    printf("%d",sum); 

} 

void terminate() { 
    sem_close(empty); 
    sem_close(full); 
    sem_close(mutex); 
    sem_unlink("EMPTY"); 
    sem_unlink("FULL"); 
    sem_unlink("MUTEX"); 
    shmctl(shmid, IPC_RMID, NULL); 
} 

int main(int argc, char **argv) 
{ 
    int i,sum; 
    init(); 

    for(i = 0;i<MAXCHILDS;i++){ 
     if((child[i]= fork()) < 0) // error occured 
     { 
      perror("Fork Failed"); 
      exit(1); 
     } 
     if((child[i] =fork())==0){ 
      writer(sh_mem->m,i); 
      exit(0); 
     } 
    } 

    /*father*/ 
    sleep(10); 
    sum++; 
    printf("%d\n",sum); 
    reader(sh_mem->m); 
    wait(NULL); 

    terminate(); 


    return 0; 
} 

我有兩個問題,現在...我需要保存的陣列,而我似乎沒有明白內存映射文件和父親的輸出被拋出很奇怪......他的輸出

0000100000[i=]3[k=]10 
0000010000[i=]4[k=]10 
0000001000[i=]5[k=]10 
0100000000[i=]0[k=]10 
0000000100[i=]6[k=]10 
0010000000[i=]1[k=]10 
0000000010[i=]7[k=]10 
0001000000[i=]2[k=]10 
0000000001[i=]8[k=]10 
0000100000[i=]3[k=]10 
0000000000[i=]9[k=]10 
0000010000[i=]4[k=]10 
0000001000[i=]5[k=]10 
0000000100[i=]6[k=]10 
0000000010[i=]7[k=]10 
0000000001[i=]8[k=]10 
0000000000[i=]9[k=]10 

它應該是這樣的:

0000100000[i=]0[k=]10 
0000010000[i=]1[k=]10 
0000001000[i=]2[k=]10 
0100000000[i=]3[k=]10 
0000000100[i=]4[k=]10 
0010000000[i=]5[k=]10 
0000000010[i=]6[k=]10 
0001000000[i=]7[k=]10 
0000000001[i=]8[k=]10 
0000100000[i=]9[k=]10 
+0

一對夫婦的意見 - 首先,你要創建一對夫婦信號燈,但你實際上是使用他們的東西它不會出現,所以你對共享內存的訪問看起來完全不同步;第二,在'writer()'中,引用'm [i] [k]',而在'reader()'中引用'm [k] [i]'。 – twalberg

+0

Duplicate:http://stackoverflow.com/questions/13224357/unix-shared-memory-and-semaphores-in-c – apple16

回答

2

該代碼調用在兩個地方fork()。刪除第二個電話。

變化:

if((child[i] =fork())==0){ 

到:

if(child[i] == 0){