为什么我使用此代码会出现分段错误?

时间:2009-04-16 20:52:49

标签: c segmentation-fault semaphore

运行此代码时出现分段错误。我无法弄清楚为什么会这样 - 有人能看到可能的原因吗? (我已经获得并初始化了信号量的共享内存。)

我的代码:
   #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;
  }

3 个答案:

答案 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)

数组分配太小。

这个例子通常太长,不能被视为一个好例子;尝试找到一个较小的(最小的是理想的)复制错误的情况,特别是依赖于尽可能少的外部库的情况。另外,尝试在调试器中运行并在询问之前逐步执行代码。