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>

#define MAXCHILDS 4
#define MAX_SIZE 10
#define MAX_WRITES 4

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;
/*pointer to matrix*/
int **p;

void init(){
      /*create pointer to matrix*/
      p = &sh_mem->m;
     /*semaphores unlink and creation */    
     sem_unlink("EMPTY");
     empty=sem_open("EMPTY",O_CREAT|O_EXCL,0700,MAX_WRITES);
     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){
    int i,k;
    for(i = 0;i<MAX_SIZE;i++){
        for(k= 0;k<MAX_SIZE;k++){
            m[i][k] = 0;
        }
    }
}

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

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;
    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);
            exit(0);
        }
    }
    /*father*/  
    reader(sh_mem->m);
    wait(NULL);

    terminate();

    return 0;
}

子は共有メモリにマトリックスを書き込むことになっており、父親は共有メモリ配列を読み取ってマトリックスを印刷することになっています。これを手伝ってくれませんか。助けてくれてありがとう ...

4

1 に答える 1

1

ここでの主なエラーは、次のように、それらに渡すのとは異なるタイプの引数を取ることreaderです。writergcc -Wall

test.c: In function ‘main’:
test.c:92:13: warning: passing argument 1 of ‘writer’ from incompatible pointer type [enabled by default]
test.c:49:6: note: expected ‘int **’ but argument is of type ‘int (*)[10]’
test.c:97:5: warning: passing argument 1 of ‘reader’ from incompatible pointer type [enabled by default]
test.c:58:6: note: expected ‘int **’ but argument is of type ‘int (*)[10]’

提供されているように、プログラムは親とすべての子でセグフォールトしました。パラメータタイプをからに変更するreaderwriterint **m以下int m[MAX_SIZE][MAX_SIZE]の修正とともに)、私が知る限り、プログラムは正常に実行されました。

他にもいくつかのエラーがあります。

  • あなたがする必要があり#include <sys/wait.h>ます。
  • グローバルint **pは使用されず、その初期化には、リーダーおよびライター関数が行ったのと同じタイプエラーがあります。
  • printf呼び出しにはreaderフォーマット文字列が必要です。使用し"%d "ました。
  • Jonathan Lefflerが指摘したようにfork()、のループを介して毎回1回だけ呼び出す必要がありますmain

それらの最後を除くすべては、コンパイラの警告によって強調表示されました。

このプログラムが失敗した理由を調査する際に、私はまた、strace -fどのシステムコールとプロセスが実際に破壊されたかを特定するために使用しました。たとえば、セマフォ関連のシステムコールは正常に返されているように見えます。ただし、ジョナサンが指摘したように、できるだけ早く失敗すると問題のデバッグがはるかに簡単になるため、戻り値にエラーがないか確認する必要があります。

于 2012-11-05T01:53:16.693 に答える