写入共享内存时出现分段错误

时间:2012-02-17 10:12:38

标签: c

请帮助检查以下代码:在linux上运行它遇到分段错误。

#deinf QID 2012

typedef struct {
   pid_t       pid;
   pthread_t   tid;
   char        msg;
} MSG;

typedef struct {
   int    q_head;
   int    q_rear;
   MSG    msgbuf[16*1024];
} QUE;

int attach_que(int que_name, int *shmid, void *shm_ptr)
{

   *shmid = shmget((key_t)que_name, sizeof(QUE), 0666 | IPC_CREAT);
   if (*shmid == -1)
   {
      printf("%d:%d failed to get shared memory.\n", getpid(),que_name);
      return -1;
   }

   printf("%d:is attaching to share memory %d.\n", getpid(), *shmid);

   shm_ptr = shmat(*shmid, (void *)0, 0);
   if (shm_ptr == (void *)-1)
   {
      printf("%d:%d failed to attch to shmget.\n", getpid(),que_name);
      return -1;
   }

   printf("%d: attched to share memory %d.\n", getpid(),*shmid);
   return -1;

}

int main()
{

   void        *shm_ptr = NULL;
   TDM_QUE     *tdm_que_ptr;
   DMINT       shmid;
   pid_t       pid;

   pid = getpid();

   printf("L-SIMCO %d:is starting.\n", pid);

   attach_tdm_que(Q_LSIMCO, &shmid, shm_ptr);
   printf("LSMICO %d:shared memory 0x%x as Q_%d.\n", pid, shm_ptr, Q_LSIMCO);
   tdm_que_ptr = (TDM_QUE *)shm_ptr;
   tdm_que_ptr->q_head = 0;
   tdm_que_ptr->q_rear = 0;

   /* if this is not first time when creating shared memory, do not init data */
   if (tdm_que_ptr->is_creat != 777777)
   {
      printf("%d: Init shared memory 0x%x by LSIMCO %d.\n", pid, shm_ptr, Q_LSIMCO);
      /* init data for shared memory */

      tdm_que_ptr->is_creat = 777777;
   }

   printf("%d is reading shared memory 0x%x.\n",pid,shm_ptr);
   ...
}
=========================
Running result is following:
-bash-3.2$ ./lsimco
 6341:is starting.
 QUE is size of 4620
6341:is attaching to share memory 0.
6341: attched to share memory 0.
6341:shared memory 0x0 as Q_2012.
Segmentation fault

感谢。

1 个答案:

答案 0 :(得分:1)

您必须在**shm_ptr调用中使用attach_que才能返回有效指针。所以,你的电话必须是我:

attach_tdm_que(Q_LSIMCO, &shmid, &shm_ptr);

,当然,在attach_tdm_que内,正确使用指针符号:

*shm_ptr = shmat(*shmid, (void *)0, 0);
if (*shm_ptr == (void *)-1)
{
    printf("%d:%d failed to attch to shmget.\n", getpid(),que_name);
    return -1;
}

更多内容:您将从-1始终attach_tdm_que返回。 此外,总是发布一个可编辑的代码。