ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

如何在两个进程之间共享链表?

2019-12-10 07:50:40  阅读:504  来源: 互联网

标签:linked-list c-3 linux ipc


我有两个过程,我想在它们之间共享一个链表.其中一个
进程将只读取列表,而其他进程将修改
列表(添加/删除条目).你能告诉我如何实现吗?

让我为其添加更多详细信息,语言是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.

标签:linked-list,c-3,linux,ipc
来源: https://codeday.me/bug/20191210/2100380.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有