Pregunta

Me estoy haciendo una violación de segmento mientras se ejecuta este código. No puedo entender por qué esto está ocurriendo - ¿alguien puede ver una posible razón? (Ya he conseguido e inicializado la memoria compartida del semáforo.)

Mi código:
   #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;
  }
¿Fue útil?

Solución

Después de un vistazo rápido (muy rápida), yo diría que puede ser causada por

struct sembuf buf[1];

/*some other code*/

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

Usted está accediendo a la memoria externa de la memoria intermedia. buf [1] se reserva memoria en la pila sólo por una sembuf estructura, que está tratando de usar 2. En ese caso, se debe utilizar

 struct sembuf buf[2]

Otros consejos

Ah ... Es evidente que hay algo muy mal cuando se declara

struct sembuf buf[1];

pero unas pocas líneas más adelante hacen

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

asignación de matriz demasiado pequeño.

Este ejemplo es generalmente demasiado largo para ser considerado un buen ejemplo; tratar de encontrar una más pequeña (el mínimo es ideal) caso que reproduce el error, particularmente uno que depende de la menor cantidad de librerías externas como sea posible. También, intente ejecutar en el depurador y recorrer el código antes de pedir.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top