我有两个进程,想在它们之间共享一个链表。其中一个进程只会读取列表,而另一个进程将修改列表(添加/删除条目)。你能告诉我如何实现吗?
更多细节:该语言为C,平台为Linux。共享内存似乎是一种方法,但我不知道如何实现。
如果有人能告诉我实现的方法,那将对我大有帮助。
我的一个想法是:我是否可以创建一个大小为节点的共享内存段?然后像使用malloc那样简单处理就行了。我的意思是,我将使用shmget(key, SHMSZ, IPC_CREAT | 0666)创建共享内存,其中SHMSZ将是结构体节点的大小。因此,我只在两个进程之间共享列表头。列表中的第一个条目除了链接条目指向列表中的下一个条目之外,所有值都为0,并且该条目是使用malloc创建的,因为在我的应用程序中,一个进程只会读取,而另一个进程会添加/删除列表中的条目。
我收到了一条回复,告诉我我不能使用malloc。我不知道为什么会这样。你能告诉我为什么我不能使用malloc吗?
以下是我尝试过的上述目的的代码,但出现了分段错误。
更多细节:该语言为C,平台为Linux。共享内存似乎是一种方法,但我不知道如何实现。
如果有人能告诉我实现的方法,那将对我大有帮助。
我的一个想法是:我是否可以创建一个大小为节点的共享内存段?然后像使用malloc那样简单处理就行了。我的意思是,我将使用shmget(key, SHMSZ, IPC_CREAT | 0666)创建共享内存,其中SHMSZ将是结构体节点的大小。因此,我只在两个进程之间共享列表头。列表中的第一个条目除了链接条目指向列表中的下一个条目之外,所有值都为0,并且该条目是使用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;
}