0

私はセマフォと共有メモリに1週間取り組んできましたが、まだいくつかの問題があります。そのため、子供たちがメモリ共有多次元整数配列に書き込み、父親がその配列を読み取ることになっているこのプログラムを作成しようとしました共有されているメモリから。

#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;
}

私は現在2つの問題を抱えています...私が理解していないように見えるメモリマップファイルに配列を保存する必要があり、父親の出力が非常に奇妙です...彼の出力は

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
4

1 に答える 1

2

コードはfork()2 つの場所で呼び出します。2 番目の呼び出しを削除します。

変化する:

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

に:

    if(child[i] == 0){
于 2012-11-05T15:40:21.093 に答える