请帮助检查以下代码:在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
感谢。
答案 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
返回。
此外,总是发布一个可编辑的代码。