使用SYSV IPC在共享内存中动态分配结构

问题描述

我正在为Linux上的C语言中的一个项目编写一个客户端服务器应用程序,我想让客户端进行身份验证,以通过SYSV套接字向服务器提供一对凭据,即username:password。 为了管理凭据,然后登录,我创建了一个结构

typedef struct authentication {
    char username[AUTHLEN];
    char password[AUTHLEN];
    int logged;     /* 1 = Logged - 0 = Not logged */
} auth_user;
auth_user *user;

此结构存储在共享内存中(需要)并受信号量保护,因此,如果我与两个客户端连接,则第一个接收身份验证表单,而第二个则等待第一个客户端结束。 我的问题是,很明显,在第一个客户端进行身份验证之后,第二个客户端完成了相同的操作,如果我想知道第一个客户端的用户名,就不能,因为第二个客户端已经覆盖了变量,现在它的用户名了存储在变量中。 因此,我想在共享内存中分配一些结构数组,但我也想动态地做到这一点,并且对于共享内存,我不能使用malloc系列函数。 与我的教授交谈时,他说要在共享内存中分配大量内存,并使用偏移量在此偏移量位置将新部分附加到新生成的进程(客户端)(其中偏移量是已使用内存的结尾)记忆的上一部分),但我不知道该怎么做。 我还尝试过使用静态数组struct,但是没有任何积极结果。

我以这种方式分配共享内存:

if((shmid=shmget(SHMKEY,SIZE,perms)) < 0) /* perms can be 0600 | IPC_CREAT */
        DieWithError("shmget() failed\n");

并附上

if((user=shmat(shmid,NULL,0)) < 0)
            DieWithError("shmat() failed\n");

我用于分配的方法有点基本,但是我对共享内存有点陌生,所以我可能缺少明显的东西,欢迎任何建议。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...