-3

このコードの実行中にセグメンテーション違反が発生します。なぜこれが起こっているのかわかりません - 誰でも考えられる理由を見ることができますか? (セマフォの共有メモリは既に取得して初期化しています。)

私のコード:
   #include<stdlib.h>
   #include<sys/types.h>
   #include<sys/shm.h>
   #include<sys/ipc.h>
   #include<stdio.h>
   #include<sys/sem.h>

   union semun 
   {
   int val;
   struct semid_ds *buf;
   unsigned short *array;
   } arg;



  int main()
  {
  key_t semkey;
  int shmid,semid,nsem,sops;
  struct sembuf buf[1];

  char *ptrr,*shm,c,*s;

  semkey=ftok("/home/mawia/abc.c",'a');

  printf("entered into main of producer\n");
  if(semkey<0)
  {
   perror("ftok");
   exit(1);
  }

  shmid=shmget(semkey,30,0777);

  if(shmid<0)
  {
   printf("error");
   perror("shmget");
   exit(1);
  }

  shm=shmat(shmid,0,0);
  if(shm==(char *) -1)
  {
  perror("shm");
  exit(1);
  } 

  s=shm;
  semid=semget(semkey,1,0777);
 if(semid<0)
 {
  printf("error");
  perror("semget");
  exit(0);
 }

 ptrr=shm+1;
 *s='w';
 printf("going to check the value 0th semaphores\n");
 buf[0].sem_num=0;
 buf[0].sem_op=0;
  buf[0].sem_flg=0;
 buf[1].sem_num=0;
 buf[1].sem_op=1;
 buf[1].sem_flg=0;
  printf("entered the critical region\n");
 //printf("waiting to enter the buffer zone...");
 semop(semid,buf,2);

 printf("entered the critical region\v");
 if(*s!='r')
 {
  printf("\nPRODUCER IS PRODUCING\n\n\n");

  printf("ENTER DATA\n");

  while((c=getchar())!='\n')
  {
    *ptrr++=c;
  }
  *ptrr='\0';
  *s='r';
 } 

  else 
  printf("RESOURCE IS FULL:CAN'T PRODUCE");

 //printf("produced enough for  the consumer \nexiting from the buffer area now...");
 buf[0].sem_num=0;
 buf[0].sem_op=-1;
 buf[0].sem_flg=0;

 semop(semid,buf,1);

 ptrr=shm+1;

  if(!strcmp(ptrr,"exit"))
  {
  printf("exiting...");
  exit(0);
  }
  sleep(1);

 return 0;
  }
4

3 に答える 3

13

ちらっと見た後(非常に簡単に)、私はそれが原因である可能性があると言うでしょう

struct sembuf buf[1];

/*some other code*/

buf[1].sem_num=0;
buf[1].sem_op=1;
buf[1].sem_flg=0;

バッファ外のメモリにアクセスしています。buf[1] は、1 つの struct sembuf 用にのみスタック内のメモリを予約します。2 を使用しようとしています。その場合、使用する必要があります。

 struct sembuf buf[2]
于 2009-04-16T20:59:40.817 に答える
4

ああ...宣言すると明らかに何かが間違っています

struct sembuf buf[1];

しかし、数行後に

buf[1].sem_num=0;
buf[1].sem_op=1;
buf[1].sem_flg=0;
于 2009-04-16T21:00:16.367 に答える
2

配列の割り当てが小さすぎます。

この例は一般に長すぎて、良い例とは言えません。エラーを再現する、より小さな (最小が理想的な) ケース、特にできるだけ少ない外部ライブラリに依存するケースを見つけようとします。また、質問する前に、デバッガーで実行してコードをステップ実行してみてください。

于 2009-04-16T21:00:01.017 に答える