linux-IPC-进程间通信 -管道、消息队列、信号、共享内存教程
linux下进程间通信一般有这4种方式
IPC (InterProcess Communication )进程间通信
管道 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)
句柄 删除 描述