我有两个过程,我想在它们之间共享一个链表.其中一个
进程将只读取列表,而其他进程将修改
列表(添加/删除条目).你能告诉我如何实现吗?
让我为其添加更多详细信息,语言是C,平台是Linux.
似乎共享内存是一种方法,但我不知道如何实现它.
如果任何人都可以告诉我实现该目标的方法,那么它将对我有很大帮助.
我有一个想法如下所述:
我可以在创建节点大小的共享内存段时执行以下操作吗?然后我只是处理malloc?我的意思是,我将在shmget(key,SHMSZ,IPC_CREAT | 0666)的帮助下创建共享内存,其中SHMSZ将是结构节点的大小.所以我只在两个过程之间共享列表的头.列表中的第一个条目的所有值均为0,链接条目除外,该链接条目指向列表中的下一个条目,并且该条目是在malloc的帮助下创建的,因为在我的应用程序中,由于其他进程将仅在添加一个进程的同时进行读取/删除列表中的条目.
我得到一个答复,告诉我我不能使用malloc.我不知道为什么我不能
使用malloc.你能告诉我为什么我不能使用malloc吗?
下面是我为上述目的而尝试的代码,但我遇到了分段错误.
struct node
{
int val;
struct node* next;
};
void append(struct node *q,int val);
main()
{
key_t key = 5678;
int shmid;
struct node *head;
if ((shmid = shmget(key, sizeof(struct node), IPC_CREAT | 0666)) < 0) {
perror("shmget");
exit(1);
};
head = struct node*(shmat(shmid, (void *) 0, 0));
head->val = 0;
head->next= 0;
append(head,2);
append(head,5);
append(head,6);
exit(0);
}
void append(struct node *q,int val)
{
struct node *temp1,*temp2;
if (q->next == 0)
{
temp1=malloc(sizeof(struct node));
temp1->val = val;
temp1->next = 0;
q->next = temp1;
}
else
{
temp2=malloc(sizeof(struct node));
temp2->val = val;
temp1 = q->next;
while(1)
{
if (temp1 == 0)
{
temp1=temp2;
break;
}
else
temp1=temp1->next;
}
}
return;
}
解决方法:
我不知道谁是Beej,但他写的出色guides,他写的是Shared memory segments.