linux进程篇 (三) 进程间的通信3 IPC通信
2024-10-19 05:27:54
3 IPC通信
用户空间 进程A <----无法通信----> 进程B
-----------------|--------------------------------------|--------------
| |
内核空间 |<-------------> IPC <--------------->| ---------------------------------------------------------------------- IPC分3种:
消息队列 共享内存 信号灯 open msgget shmget semget
read/write msgsen msgrecv shmat shmdt semop
close msgctrl shmctrl semctrl
3.1 共享内存
#include <sys/shm.h>
#include <sys/ipc.h>
#include <sys/types.h> int shmget(key_t key, size_t size, int shmflg); //创建共享内存
key_t ftok(const char *path, int id); //创建key值 void *shmat(int shmid, const void *shmaddr, int shmflg); //将共享内存的地址映射到用户空间
int shmdt(const void *shmaddr);
int shmget(key_t key, size_t size, int shmflg); //key IPC_PRIVATE 或者ftok的返回值
//size_t size 共享内存的大小#include <sys/ipc.h> system("ipcs -m"); //查看共享内存
sprintf(cmd,"ipcrm -m %d",shmid);
system(cmd); //删除共享内存 key_t ftok(const char *path, int id); //创建key值
//path文件路径,id 一个字符
//成功-> key 失败-> -1;
void *shmat(int shmid, const void *shmaddr, int shmflg); //将共享内存的地址映射到用户空间
//int shmid :ID号
//const void *shmaddr 映射到的地址,NULL为系统自动分配
//shmflg SHM_RDONLY 只读,默认是0 可读可写
//返回值 映射后的地址。 失败NULL
3.2 消息队列
3.3 信号灯
#include <sys/sem.h> int semget(key_t key, int nsems, int semflg); //创建sem信号灯 int semctl(int semid, int semnum, int cmd, ...); //关闭sem信号灯 #include <semaphore.h>
int sem_wait(sem_t *sem);
int sem_post(sem_t *sem);
例子 1.shmget
#include <stdio.h>
#include <string.h>
#include <sys/shm.h>
#include <sys/ipc.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h> int main(int argc, char const *argv[])
{
int shmid;
char cmd[];
shmid = shmget(IPC_PRIVATE,,);
if(shmid < ){
perror("shmget");
}
printf("shmid = %d\n",shmid);
system("ipcs -m"); //查看 sprintf(cmd,"ipcrm -m %d",shmid);
system(cmd);
return ;
}
2.
最新文章
- SerialPort 串口开发
- Firefox 插件 FlashGot 创建 Axel 下载任务
- 头文件algorithm中的常用函数
- git点滴的积累
- sizeof()和strlen()的区别与联系
- python 练习 18
- Redis应用案例,查找某个值的范围(转)
- JAVA IO 类库详解
- IDEA中利用JUnit进行单元测试
- MSIL
- Swift - whose view is not in the window hierarchy 问题解决方法
- MySQL查询1
- 有关Ajax跨域请求的解决方案
- js万年历,麻雀虽小五脏俱全,由原生js编写
- Java 网络IO编程总结(BIO、NIO、AIO均含完整实例代码)
- __x__(22)0907第四天__ 垂直外边距重叠
- 发现了一个比较有意思的url参数
- Android Studio导入jar包
- Java 强制类型转换(类转换注意事项)
- Django REST framework 第五章 Relationships &; Hyperlinked APIs
热门文章
- 【Leetcode】【Medium】Construct Binary Tree from Preorder and Inorder Traversal
- Python学习---socketServer编程
- 什么是封装? ----------------php中";public";类似的访问修饰符分别有什么作用?----什么是抽象?抽象的关键字以及用法----- 什么是接口?接口的关键字以及用法-------------
- 新款Macbook 安装任意来源软件教程 mac软件下载资源推荐
- spring初始化完成后执行初始化数据方法
- July 09th 2017 Week 28th Sunday
- 在Kubernetes上运行SAP UI5应用(下): 一个例子体会Kubernetes内容器的高可用性和弹性伸缩
- 程序中实现两个DataTable的Left Join效果(修改了,网上第二个DataTable为空,所处的异常)
- Java 学习笔记1
- Redis配置文件(1)units/includes/GENERAL/SECURITY/LIMITS