VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1313|回复: 4

2个进程,如何有效的共享变量?

[复制链接]

1

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-1-28 14:00:02 | 显示全部楼层 |阅读模式

2个进程,

其中一个进程中的一个全局变量,需要让另外一个进程访问

我用一般的方法,得到的始终是变量的初值,

应该如何解决那?

回复

使用道具 举报

0

主题

12

帖子

9.00

积分

新手上路

Rank: 1

积分
9.00
发表于 2020-3-2 06:30:01 | 显示全部楼层
进程间通信……
共享内存吧
回复

使用道具 举报

0

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-5-13 02:30:02 | 显示全部楼层
shared mem
回复

使用道具 举报

0

主题

4

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
发表于 2020-5-14 13:00:01 | 显示全部楼层
用共享内存吧

共享存储允许两个或多个进程共享一给定的存储区,是最快的一种IPC。内核为每个共享存储段设置了一个shmid_ds结构。

函数shmget获得一个共享存储标识符,其函数原型如下:
#include  <sys/types.h>
#include  <sys/ipc.h>
#include  <sys/shm.h>
int  shmget(key_t  key, int  size, int  flag) ;
说明:
参数key是共享存储字段。
           size是该共享存储段的最小值。如果正在创建一个
新段,则必须指定其size。如果正在存访一个现存的段,
则将size指定为0。
回复

使用道具 举报

0

主题

4

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
发表于 2020-5-14 17:45:01 | 显示全部楼层
flag可以设置共享存储段的访问权限,也可以设置
两个标志:IPC_CREAT和IPC_EXCL。
           shmget调用成功返回一个非负整数,即与key相连
的共享存储段id。如果是一个新的共享存储段,shmget
将初始共享存储段中所有单元为0,同时创建与参数key
相连的数据结构shmid_ds。
           shmget调用失败将返回-1并置errno指明错误原因。
shmctl函数对共享存储段执行多种操作,其函数原型如
下:
#include  <sys/types.h>
#include  <sys/ipc.h>
#include  <sys/shm.h>
int shmctl(int  shmid, int  cmd, struct  
                                                    shmid_ds *buf) ;
说明:
           cmd参数指定下列5种命令中一种,使其在shmid指
定的段上执行:
IPC_STAT 对此段取shmid_ds结构,并存放在由buf指向的结构中。
IPC_SET 按buf指向的结构中的值设置与此段相关结构中的下列三个字段:shm_perm.uid、shm_perm.gid以及shm_perm.mode。
IPC_RMID 从系统中删除该共享存储段。因为每个共享存储段有一个连接计数(shm_nattch在shmid_ds结构中) ,所以除非使用该段的最后一个进程终止或与该段脱接,否则不会实际上删除该存储段。不管此段是否仍在使用,该段标识符立即被删除,所以不能再用shmat与该段连接。
SHM_LOCK 锁住共享存储段。此命令只能由超级用户执行。
SHM_UNLOCK 解锁共享存储段。此命令只能由超级用户执行。
一旦创建了一个共享存储段,进程就可调用shmat将其
连接到它的地址空间中,其函数原型如下:
#include  <sys/types.h>
#include  <sys/ipc.h>
#include  <sys/shm.h>
void *shmat(int  shmid, void  *addr, int  flag);
说明:
           共享存储段连接到调用进程的哪个地址上与addr
参数以及在flag中是否指定SHM_RND位有关。
(1) 如果addr为0,则此段连接到由内核选择的第一个可用地址上。
(2) 如果addr非0,并且没有指定SHM_RND,则此段连接到addr所指定的地址上。
(3) 如果addr非0,并且指定了SHM_RND,则此段连接到( addr-(addr mod SHMLBA))所表示的地址上。
          如果在flag中指定了SHM_RDONLY位,则以只读方
式连接此段。否则以读写方式连接此段。shmat的返回值
是该段所连接的实际地址,如果出错则返回-1。
当进程不再需要一个共享存储段时,可以调用shmdt函数
将它从进程的地址空间分离。其函数原型如下:
#include  <sys/types.h>
#include  <sys/ipc.h>
#include  <sys/shm.h>
int shmdt(void *addr) ;
说明:
            addr参数是以前调用shmat时的返回值。注意,这
个函数仅是是一个共享存储段不再与调用进程的地址空
间相连,它并不实际删除共享存储段本身,删除共享存
储段是shmctl函数IPC_RMID命令的功能。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表