1共享内存:
是linux IPC中是最快的进程间通信方式,粗略理解就是系统为两个进程提供一个可以访问的同一地址空间,进行通信,但必然带来对其访问的一些控制问题,所以需要和信号量等配合使用。涉及到的api如下:
1 key_t ftok(char *pathname, int prj_id);//获取key值
2 int shmget(key_t
key, size_t size, int shmflg);//获取/创建共
享内存id
3
void *shmat(int
shmid, const void *shmaddr, int shmflg)//通过id获取
共享内存地址,与共享内存关联,之后才允许访问。
第二个参数的地址是可以指定的共享内存地址,通常让系统指定,我们不关心,设为NULL
4 int shmctl(int shmid, int command, struct shmidds *buf);
其中command//仅说明通用的,linux特有的没管
IPC_STAT:获取共享内存的当前信息,存储在buf中
IPC_SET:设置共享内存buf中的 部分信息
IPC_RMID:给共享内存加个标志,在所有进程与共享内存分离后删除之,需要创建该共享内存的成员或者有权限者
5 int shmdt(const void *
shmaddr);//将共享内存从当前进程中分离,不删除共享内存,只是当前进程不可用了
测试代码如下://所有测试需要自己创建下ftok()的filename,即获取key值所需的/tmp/下的文件
-
#include <stdio.h>
-
#include <sys/ipc.h>
-
#include <unistd.h>
-
#include <sys/shm.h>
-
-
#define SHM_SIZE 256
-
-
void *init_shm(char *pathname)//两个进程公用的代码
-
{
-
int id;
-
key_t key;
-
void *addr;
-
-
key = ftok(pathname, 1);//通过文件获取key值
-
if (key < 0) {
-
perror("ftok()");
-
}
-
-
id = shmget(key, SHM_SIZE, IPC_CREAT | 0600);//创建shmem,注意要给权限
-
if (id < 0) {
-
perror("shmget()");
-
}
-
-
addr = shmat(id, NULL, 0);//关联shmem,通过id得到我们操作的共享内存首地址,才可用
-
if (addr == ((void *)-1)) {
-
perror("shmat()");
-
}
-
-
return addr;
-
}
-
-
int main(int argc, char **argv)
-
{
-
pid_t pid;
-
-
if ((pid = fork()) < 0) {
-
perror("fork");
-
} else if (pid == 0) { // child
-
char *str1 = init_shm("/tmp/1");
-
sprintf(str1, "hello i write onece here");//向共享内存中写数据,和操作自己的空间没区别
-
} else { // parent
-
char *str = init_shm("/tmp/1");
-
sleep(1);//让子进程写完,因为没加控制访问的部分(参见我写的信号量简单例子)
-
printf("i get :\" %s\"\n", str);//读取共享内存中的数据,确认两个进程都可以访问
-
}
-
return 0;
-
}
阅读(1984) | 评论(0) | 转发(0) |