这篇文章主要讲解了“linux进程共享内存的方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Linux进程共享内存的方法是什么”吧!共享内存 IPC 原理共享内存进程间通信机制主要用
这篇文章主要讲解了“linux进程共享内存的方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Linux进程共享内存的方法是什么”吧!
共享内存进程间通信机制主要用于实现进程间大量的数据传输,下图所示为进程间使用共享内存实现大量数据传输的示意图:
共享内存是在内存中单独开辟的一段内存空间,这段内存空间有自己特有的数据结构,包括访问权限、大小和最近访问的时间等。该数据结构定义如下:
from /usr/include/linux/shm.hstruct shmid_ds {struct ipc_perm shm_perm; int shm_segsz; __kernel_time_t shm_atime; __kernel_time_t shm_dtime; __kernel_time_t shm_ctime; __kernel_ipc_pid_t shm_cpid; __kernel_ipc_pid_t shm_lpid; unsigned short shm_nattch; unsigned short shm_unused; void *shm_unused2; void *shm_unused3; };
两个进程在使用此共享内存空间之前,需要在进程地址空间与共享内存空间之间建立联系,即将共享内存空间挂载到进程中。
系统对共享内存做了以下限制:
#define SHMMAX 0x2000000 #define SHMMIN 1 #define SHMMNI 4096 #define SHMALL (SHMMAX/getpagesize()*(SHMMNI/16))#define SHMSEG SHMMNI
1.创建共享内存
#include #include
int shmget(key_t key, size_t size, int shmflg);
2.共享内存控制
#include #include
int shmctl(int shmid, int cmd, struct shmid_ds *buf);
3.映射共享内存对象
系统调用 shmat() 函数实现将一个共享内存段映射到调用进程的数据段中,并返回内存空间首地址,其函数声明如下:
#include #include
void *shmat(int shmid, const void *shmaddr, int shmflg);
4.分离共享内存对象
在使用完毕共享内存空间后,需要使用 shmdt() 函数调用将其与当前进程分离。函数声明如下:
#include #include
int shmdt(const void *shmaddr);
使用 fork() 函数创建一个子进程后,该进程继承父亲进程挂载的共享内存。
如果调用 exec() 执行一个新的程序,则所有挂载的共享内存将被自动卸载。
如果在某个进程中调用了 exit() 函数,所有挂载的共享内存将与当前进程脱离关系。
程序实例
申请一段共享内存,父进程在首地址处存入一整数,子进程读出。
#include#include #include #include #include#include#define SHM_SIZE 1024int main(){int shm_id, pid;int *ptr = NULL;
shm_id = shmget((key_t)1004, SHM_SIZE, IPC_CREAT | 0600);
ptr = (int*)shmat(shm_id, 0, 0);printf("Attach addr is %p \n", ptr);*ptr = 1004;printf("The Value of Parent is : %d \n", *ptr);if((pid=fork()) == -1){perror("fork Err");exit(0);}else if(!pid){printf("The Value of Child is : %d \n", *ptr);exit(0);}else{sleep(1);
shmdt(ptr);
shmctl(shm_id, IPC_RMID, 0);}return 0;}
输出结果:
感谢各位的阅读,以上就是“Linux进程共享内存的方法是什么”的内容了,经过本文的学习后,相信大家对Linux进程共享内存的方法是什么这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!
--结束END--
本文标题: Linux进程共享内存的方法是什么
本文链接: https://lsjlt.com/news/315272.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-03-01
2024-03-01
2024-03-01
2024-03-01
2024-03-01
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0