网站关键词免费优化,怎么制作电商网页,建设银行发卡银行网站,做标签网站邀请码#xff08;一#xff09;发行版#xff1a;Ubuntu16.04.7 #xff08;二#xff09;记录#xff1a;
#xff08;1#xff09;什么是共享内存
共享内存是System V版本的最后一个进程间通信方式。共享内存#xff0c;顾名思义就是允许两个不相关的进程访问同一个逻辑…一发行版Ubuntu16.04.7 二记录
1什么是共享内存
共享内存是System V版本的最后一个进程间通信方式。共享内存顾名思义就是允许两个不相关的进程访问同一个逻辑内存共享内存是两个正在运行的进程之间共享和传递数据的一种非常有效的方式。不同进程之间共享的内存通常为同一段物理内存。进程可以将同一段物理内存连接到他们自己的地址空间中所有的进程都可以访问共享内存中的地址。如果某个进程向共享内存写入数据所做的改动将立即影响到可以访问同一段共享内存的任何其他进程。
2shmget函数 头文件sys/ipc.h、sys/shm.h 函数原型: int shmget(key_t key,size_t size,int shmflg); 参数key_t keyIPC_PRIVATE或者是ftok函数的返回值 size_t size: 共享内存的大小 int shmflg: 权限 返回值成功返回共享内存的标识符失败返回-1。 3shmget函数编译运行
a.使用IPC_PRIVATE
#include stdio.h
#include sys/ipc.h
#include sys/shm.hint main(void)
{
int shmid;
shmidshmget(IPC_PRIVATE,1024,0777);
if(shmid-1)
{
printf(shmget error.\n);
return -1;
}
printf(shmget is ok and shmid is %d\n,shmid);
return 0;
}删除共享内存 4ftok函数 头文件sys/types.h、sys/ipc.h 函数原型key_t ftok(const char *pathname,int proj_id); 参数const char *pathname文件路径以及文件名 int proj_id字符 返回值成功返回key值失败返回-1 5ftok函数编译运行需要先创建m.c
#include stdio.h
#include sys/ipc.h
#include sys/shm.hint main(void)
{
int shmid;
key_t key;
keyftok(./m.c,m);
shmidshmget(key,1024,0777|IPC_CREAT);
if(shmid-1)
{
printf(shmget error.\n);
return -1;
}
printf(shmget is ok and shmid is %d\n,shmid);
return 0;
} 可以发现用ftok创建的共享内存的key值不为0 。
6shmat函数 头文件:sys/types.h、sys/shm.h 函数原型void *shmat(int shmid,const void *shmaddr,int shmflg); 参数int shmid共享内存的标识符就是shmget函数的返回值 const void *shmaddr映射到的地址一般写NULLNULL为系统自动完成的映射 int shmflg:通常为0表示共享内存可读可写或者SHM_RDONLY,表示共享内存只读 返回值成功返回共享内存映射到进程中的地址失败返回-1 7shmdt函数 头文件sys/types.h、sys/shm.h 函数原型int shmdt(const void *shmaddr); 参数const void *shmaddr:共享内存映射后的地址 返回值成功返回0失败返回-1 注意shmdt函数是将进程中的地址映射删除也就是说当一个进程不需要共享内存的时候就可以使用这个函数将他从进程地址空间中脱离并不会删除内核里面的共享内存对象。 8父进程与子进程进行通信
//父进程与子进程通过共享内存通信
#include stdio.h
#include sys/ipc.h
#include sys/shm.h
#include unistd.h
#include sys/types.h
#include sys/wait.h
#include string.h
#include stdlib.h
int main(void)
{
int shmid;
key_t key;
pid_t pid;
//映射地址
char *s_addr,*p_addr;
//创建共享内存
keyftok(./m.c,m);
shmidshmget(key,1024,0777|IPC_CREAT);
if(shmid-1)
{
printf(shmget error.\n);
return -1;
}
printf(shmget is ok and shmid is %d\n,shmid);
//创建进程
pidfork();
//父进程
if(pid 0)
{//映射地址p_addrshmat(shmid,NULL,0);strncpy(p_addr,hello,5);wait(NULL);exit(0);
}
//子进程
if(pid 0)
{sleep(2);s_addr shmat(shmid,NULL,0);printf(s_addr is %s\n,s_addr);exit(0);
}
return 0;
} 三命令