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 

该代码在两个地方调用fork() 。 删除第二个电话。

更改:

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

至:

  if(child[i] == 0){