2012-02-17 104 views
-1

请帮忙检查下面的代码:在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

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

attach_tdm_que(Q_LSIMCO, &shmid, &shm_ptr); 

,当然,里面attach_tdm_que,使用指针asignation正确:

*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; 
} 

更多的东西:你是从attach_tdm_que八方通-1返回。 此外,allways发布可编译代码。

+0

非常感谢。我的问题是由你的正确性解决的。 – 2012-02-22 11:09:37

+1

@ Joe.Z没有投票;-) – 2012-02-22 11:34:00

+0

对不起,不知道投票的事情。现在请检查它。再次感谢 – 2012-02-29 01:44:09