2012-02-17 106 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