目录
进程通信就是两个或多个进程之间进行数据层面的交互。
进程通信的目的
1.数据传输:一个进程需要将自己的数据传输给另一个进程。
2.资源共享:多个进程间共享同样的资源。
3.通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程)。
4.进程控制:有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变。
进程之间要想通信它们之间必须要有同一份“资源”,进程通过向“资源”里写入数据让其他进程读取被写入的数据从而实现进程间的数据交互,那这份资源要让谁来提供呢?该“资源”其实就是操作系统提供的内存,因为进程是具有独立性的如果这份“资源”由想要进行通信的进程提供就会破坏进程的独立性,因此必须要让第三方即操作系统来提供。
进程之间要进行单向通信,所以一个进程在通信时只能打开读端或写端!
进程fork后生成一个子进程,该子进程的files_struct是拷贝父进程的files_struct,因此子进程文件描述附表指向同样的内存级文件(管道),内存级文件,该文件在操作系统内核中,在磁盘上无对应的文件,由于每个进程打开管道时都有读端和写端,即每个进程都能向管道里写数据和从管道里读数据。
如果要通信的两个进程没有任何关系,可以用上述依据文件描述符角度来进行进程间通信吗?
不可以,因为如果两进程不是父子、兄弟、爷孙关系,两进程的files_struct就没有相同的管道文件的struct file*类型的指针,就不能找到同一个管道进行数据交互了!