linux-IPC-进程间通信 -管道、消息队列、信号、共享内存
linux下进程间通信 IPC (InterProcess Communication )一般有5种方式,本文讲述其中的4种。
管道、消息队列、信号、共享内存
过程基本就是创建、删除、发送、接收、管理。
管道 pipe
1.创建pipe
int pipe(int pipefd[2])
返回值:0 失败 -1
2.命名管道
int mkfifo(const char *pathname,mode_t mode);
管道文件的路径名 权限
返回值:0,失败 -1;
消息队列
linux
1.创建消息 int msgget(key_t key,int shmflg)
队列标识 队列
返回值:代码操作的句柄,失败-1
2.接收消息
ssize_t msgrcv(int msqid,void *msgp,size_t msgsz,long msgtype, int msgflg);
操作句柄 接收数据 大小 接收的数据类型 标志选项
返回值:
3.发送消息
int msgsnd(int msqid,const void *msgp,size_t msgsz,int msgflg);
4.消息队列控制
int msgctl(int msqid,int cmd,struct msqid_ds *buf)
消息队列
windows MFC
1.创建 .h
//{{AFX_MSG()
afx_msg void MyFun(UNIT,LONG);
//{{AFX_MSG()
DECLARE_MESSAGE_MAP()
2.发送
LRESULT sendMessage(HWND hwnd, 窗口句柄
UINT msg, 其他消息
WPARAM wParam,
LPARAM lParam,);
3.处理消息 .cpp文件
BEGIN_MESSAGE_MAP(,)
ON_MESSAGE(WM_MYWND1,MyFun)
END_MESSAGE_MAP()
void MyFun(UNIT uparam,LONG lparam)
信号量 计数器
1.创建
int semget(key_t key,int nsems,int semflg);
信号集名字 指定一次创建多少个信号量
返回值:成功 信号集标识码 失败:-1
2.设置初始值:
int semctl(int semid,intsemnum, int cmd,…);
信号集标识码 第几个信号量 具体操作(设单个初值,设多个初值,删信号集)
3.访问信号量
int semop(int semid,struct sembuf *sops,unsigned nsops);
返回值: 结构体
共享内存 (聊天)
1.创建 int shmget(key_t key,size_t size,int shmflg)key_t key 共享内存字段名称,大小,
返回:成功,操作句柄
失败:-1
2.映射到虚拟地址空间 void shmat(int shmid,const void *shmaddr,int shmflg)
操作句柄 地址 只读
3.解除映射 int shmdt(const void shmddr) 共享内存地址
返回:成功0 失败-1
4.删除 int shmctl(int shmid,int cmd, struct shmid_ds *buf)
句柄 删除 描述