運行此代碼時出現分段錯誤。我無法弄清楚爲什麼會發生這種情況 - 任何人都可以看到可能的原因? (我已經拿到並初始化信號量的共享內存)。爲什麼我使用此代碼獲得分段錯誤?
我的代碼:#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;
}
試着用調試器中運行,找出*,其中*你的代碼沒有。然後將其編輯爲合理的長度和更有針對性的問題。 – dmckee 2009-04-16 20:57:11
你有沒有得到一個核心轉儲文件?嘗試用gdb打開它。 – Alan 2009-04-16 20:58:14
@馬克英格拉姆:對不起,我毀了你的編輯。我試圖將這兩者結合到兩全其美的世界中(並且將你的「while」改變爲「while」!):P)。 – 2009-04-16 21:12:53