Question

Je reçois une erreur de segmentation lors de l'exécution de ce code. Je ne peux pas comprendre pourquoi cela se produit - peut-on voir une raison possible? (Je l'ai déjà obtenu et initialisé la mémoire partagée du sémaphores.)

Mon code:
   #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;
  }
Était-ce utile?

La solution

Après un rapide coup d'œil (très rapide), je dirais que cela peut être causé par

struct sembuf buf[1];

/*some other code*/

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

Vous accédez à la mémoire en dehors du tampon. buf [1] se réserve la mémoire dans la pile pour une seule sembuf struct, vous essayez d'utiliser 2. Dans ce cas, vous devez utiliser

 struct sembuf buf[2]

Autres conseils

Ah ... il y a évidemment quelque chose de très mal quand vous déclarez

struct sembuf buf[1];

mais quelques lignes font plus tard

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

Array allocation trop petite.

Cet exemple est généralement trop long pour être considéré comme un bon exemple; essayez de trouver un plus petit (minimum est idéal) cas qui reproduit l'erreur, en particulier celle qui dépend aussi peu de bibliothèques externes que possible. De plus, essayez d'exécuter dans le débogueur et parcourant le code avant de demander.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top