我正在尝试编写一个共享结构类型的代码,但是当tryign在共享内存中的结构成员中写入时,我得到了分段错误,共享内存位于父进程和子进程之间。正如我在代码中显示的那样,我现在只是试着访问struct成员,所以我可以稍后使用信号量进行同步。
提前完成。
typedef struct file
{
char *shmPtr;
} file_entry;
int main (void)
{
int shmid;
int n;
file_entry *entries;
if (fork() == 0) {
/*wait for a while*/
if ((shmid = shmget(20441, sizeof(file_entry), 0666)) == -1) {
printf("shmget");
exit(2);
}
entries = (file_entry*) shmat(shmid, 0, 0);
if (entries->shmPtr == (char *) -1) {
printf("problem2");
exit(2);
}
printf("\nChild Reading ....\n\n");
printf("%s\n", entries->shmPtr[0]);
printf("%s\n", entries->shmPtr[1]);
putchar('\n');
printf("\nDone\n\n");
} else {
if ((shmid = shmget(20441, sizeof(file_entry), IPC_CREAT | 0666)) == -1) {
printf("problem3");
exit(2);
}
entries = (file_entry *) shmat(shmid, 0, 0);
if (entries->shmPtr == (char *) -1) {
printf("problem4");
exit(2);
}
printf("done attachment"); /*the parent prints this statment, then segmentation fault*/
entries->shmPtr[0]='a';
entries->shmPtr[1]='b';
putchar('\n');
wait();
shmdt(&shmid);
}
exit(0);
}
答案 0 :(得分:1)
shmat
返回指向共享内存区域的指针。在您的代码中,在致电shmat
后,entries
指向共享区域。然后,您将该共享区域的前几个字节视为指向char(shmPtr
)的指针。 shmPtr
的值未初始化,并指向某个随机位置。然后你尝试写它并获得段错误。
修改强>
正如理查德建议的那样,你可以摆脱结构,只使用char *
。但是,我猜你使用struct
而不只是char *
的原因是你计划将来在结构中添加一些额外的字段。如果是这种情况,您可以使用灵活的阵列成员:
typedef struct file
{
int flag;
int blah;
char shmPtr[];
} file_entry;
,分配变为
shmget(20441, sizeof(file_entry) + bufsize, IPC_CREAT | 0666)
当然,如果缓冲区大小是固定的,你可以硬编码:
typedef struct file
{
int flag;
int blah;
char shmPtr[BUFSIZE];
} file_entry;
/* ... */
shmget(20441, sizeof(file_entry), IPC_CREAT | 0666)