¿Por qué aparece un fallo de segmentación con este código?
-
09-09-2019 - |
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;
}
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.