今天我们来讲进程间的通信!
首先我们来看进程间通信的目的!
总的来说就是为了实现进程间的协同!
然后首先我们来了解一个前提!
只要能看到同一份资源,两个进程就完成了进程间的通信!并且该资源不能由进程两方任意一方拥有!必须由稳定的第三方提供(一般就是操作系统),然后两方申请这个资源然后进行通信!
由此就衍生出了管道,system v,posix通信
其中system v一般用于本地两个进程间的通信。
posix进程间通信则是用于网络通信的(网络部分我们再讲)
所以我们首先来讲管道
1:匿名管道
我们先讲匿名管道。
首先我们看上图,我们就可以知道在创建子进程的时候,会浅拷贝fd表,这样两个进程就会指向同样的资源!
这样我们就可以创建一个管道文件帮助完成父子进程之间的通信!
并且这个通信不用借助磁盘是一个内存级的通信,所以这个管道就被称为匿名管道!
然后为了我们实现的方便,我们的管道只能进行单向通信!
匿名管道是Linux中一种非常古老的进程间通信方式,实际上是由内核管理内核中的一块缓冲区,本质就是一个内存级的文件,但它没有名字,所以称之为“匿名管道”。这种通信方式主要用于父子进程间的通信,父进程和子进程共同使用这个管道文件来传输数据。
如果想要父子进程互相通信,我们就必须建立两个管道文件然后再进行互相通信!
接下来我们就来看如何创建和使用匿名管道!
首先我们来看一下创建管道的原理
然后我们就开始实操,创建管道和子进程
然后再让父子关闭相应的进程。
然后我们再完善子进程写入的代码以使实验效果更明显。
其中snprintf是一个在C语言中使用的函数,用于格式化字符串并将结果写入指定的缓冲区中。它类似于printf函数,但可以将格式化后的字符串输出到一个指定大小的字符数组中,从而避免缓冲区溢出的问题。snprintf函数的主要作用是将格式化的数据(如数字、字符串等)转换为一个字符串,并将该字符串写入到一个指定的缓冲区中,以便后续处理。因此,snprintf是一种常用的格式化输出函数,可以将指定格式的内容写入指定长度的缓冲区中。