接上篇文章
Linux 7种 进程间通信方式-CSDN博客文章浏览阅读319次,点赞8次,收藏6次。通过文件实现进程间通信 必须人为保证先后顺序 A--->硬盘---> B(B不知道A什么时候把内容传到硬盘中)1.无名管道2.有名管道3.信号4.消息队列5.共享内存6.信号灯集原理:如果A和B进程想要通过无名管道通信,那就,A进程向管道的一端写数据,B进程可以从管道的另外一端读数据。在A进程和B进程进行数据传输的时候是的。无名管道是的通信方式。如果A进程一直向管道中写数据写满64K的时候A进程阻塞,直到B进程读一部分数据之后A才能继续写。https://blog.csdn.net/CSDN_DU666666/article/details/139904835?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22139904835%22%2C%22source%22%3A%22CSDN_DU666666%22%7D(内部进程通信Internal process communication 一般问指的是System V版本的以下三个)
4.消息队列
5.共享内存
6.信号灯集合
ipcs查看IPC进程间通信
ipcs -q //查看消息队列
ipcs -m //查看共享内存
ipcs -m //查看信号灯集
ipcrm -q msqid //删除消息队列
ipcrm -m shmid //删除共享内存
ipcrm -s semid //删除信号灯集
API
#include <sys/ipc.h>
key_t ftok(const char *pathname, int proj_id);
功能:获取IPC进程间通信的键值(两者只有键相同,才能找到是同一个消息队列 或共享内存或信号灯集)
参数:
@pathname:路径及名字
@proj_id:id号只有低8bit有效
返回值:成功返回key,失败返回-1置位错误码
key(32bit) = inode(16) devno(8) proj_id(8)
实例
#include <head.h>
int main(int argc,const char * argv[])
{
key_t key;
struct stat st;
if((key=ftok("/home/dgf",'k'))==-1){
perror("ftok error");
exit(-1);
}
printf("key = %#x\n",key);
if(stat("/home/dgf",&st)){
perror("stat error");
}
printf("ino = %#lx,st_dev = %#lx,proj_id = %#x\n",st.st_ino,st.st_dev,'k');
return 0;
}
结果
消息队列
API
(msgget|msgsnd|msgrcv|msgctl)
#include <sys/ipc.h>
#include <sys/msg.h>
int msgget(key_t key, int msgflg);
功能:创建消息队列
参数:
@key:键值
key:通过ftok获取
IPC_PRIVATE:只能用于亲缘间进程的通信
@msgflag:消息队列的标志位
IPC_CREAT|0666 或 IPC_CREAT|IPC_EXCL|0666 (PS:这里的0666就不会和umask取反相与了)
返回值:成功返回消息队列号,失败返回-1置位错误码
int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
功能:向消息队列中发消息
参数:
@msqid:消息队列号
&