网站技术架构图,做视频投稿赚钱的网站好,爱采购网,商业设计网站推荐#x1f4d8;北尘_#xff1a;个人主页 #x1f30e;个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上#xff0c;不忘来时的初心 文章目录 一、进程间通信1、进程间通信的目的2、进程间通信发展3、进程间通信分类 二、管道1、什么是管… 北尘_个人主页 个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上不忘来时的初心 文章目录 一、进程间通信1、进程间通信的目的2、进程间通信发展3、进程间通信分类 二、管道1、什么是管道2、用fork来共享管道原理3、站在文件描述符角度-深度理解管道4、管道的五个特点5、管道的四种场景6、代码示例 一、进程间通信
1、进程间通信的目的
数据传输一个进程需要把他的数据传给另外一个进程。资源共享多个进程之间共享同样的资源。通知事件一个进程需要向另一个或一组进程发送消息通知它它们发生了某种事件如进程终止时要通知父进程。
2、进程间通信发展
管道本质上就是文件System V进程间通信POSIX进程间通信
3、进程间通信分类 管道 匿名管道pipe命名管道 System V IPC System V 消息队列System V 共享内存System V 信号量 POSIX IPC 消息列队共享内存信号量互斥量条件变量读写锁 二、管道
1、什么是管道
管道是Unix中最古老的进程间通信的形式。 我们把从一个进程连接到另一个进程的一个数据流称为一个“管道”
2、用fork来共享管道原理 3、站在文件描述符角度-深度理解管道 4、管道的五个特点
具有血缘关系才可以进程间通信。管道只能进程单向通信。父子协同 同步和互斥。面向字节流。管道是基于文件的而文件的声明周期是随进程的。
5、管道的四种场景
读写端正常如果管道为空写端会堵塞读写端正常如果管道已满读端会堵塞读端正常读写端关闭读端就会读到0表示读到文件结尾不会堵塞写端正常读读端关闭则write操作会产生信号SIGPIPE,进而可能导致write进程退出。
6、代码示例
#includeiostream
#includesys/types.h
#includecstdio
#includeunistd.h
#includesys/wait.h
#includestring
#includecstring
using namespace std;
#define NUM 1024
#define N 2void Writer(int fd)
{char buffer[NUM];string shello l am child;pid_t idgetpid();int number0;while(1){sleep(1);buffer[0]0;snprintf(buffer,sizeof(buffer),%s-%d-%d,s.c_str(),id,number);write(fd,buffer,strlen(buffer));}
}
void Reader(int id)
{char buffer[NUM];while(1){buffer[0]0;ssize_t nread(id,buffer,sizeof(buffer));if(n0){buffer[n]\0;coutbufferendl;}}
}
int main()
{int pipefd[N]{0};int npipe(pipefd);if(n0) return 1;pid_t idfork();if(id0) return 2;if(id0){//子进程close(pipefd[0]);Writer(pipefd[1]);exit(0);}//父进程close(pipefd[1]);Reader(pipefd[0]);pid_t ridwaitpid(id,nullptr,0);return 0;
}