У меня есть два процесса, и я хочу поделиться связанным списком между ними. Один из
процессы просто будут читать список, в то время как другой процесс собирается изменить
список (добавить / удалить записи). Можете ли вы сказать мне, как этого добиться?
Позвольте мне добавить более подробную информацию, язык 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;
}