运行此代码时出现分段错误。我无法弄清楚为什么会这样 - 有人能看到可能的原因吗? (我已经获得并初始化了信号量的共享内存。)
我的代码: #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;
}
答案 0 :(得分: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]只为一个struct sembuf保留堆栈中的内存,你试图使用2.在这种情况下,你应该使用
struct sembuf buf[2]
答案 1 :(得分:4)
啊......当你宣布
时,显然有一些非常错误struct sembuf buf[1];
但稍后会做几行
buf[1].sem_num=0;
buf[1].sem_op=1;
buf[1].sem_flg=0;
答案 2 :(得分:2)
数组分配太小。
这个例子通常太长,不能被视为一个好例子;尝试找到一个较小的(最小的是理想的)复制错误的情况,特别是依赖于尽可能少的外部库的情况。另外,尝试在调试器中运行并在询问之前逐步执行代码。