Linux——进程间通信
·
目录
只有认知的突破💫才能带来真正的成长💫编程技术的学习💫没有捷径💫一起加油💫

🍁感谢各位的观看🍁欢迎大家留言🍁咱们一起加油🍁努力成为更好的自己🍁
进程间通信
匿名管道
匿名管道是内存级别的文件,它适用于血缘关系的进程。如下图所示:

匿名管道的创建和使用
创建函数:int n = pipe(pip_fd);创建成功后,它会返回两个文件描述符,然后根据需要关闭对应的读写端。如下所示的代码:
int pip_fd[2] = {0};
int n = pipe(pip_fd);
//pip_fd数组的第一个元素对应管道的读端,第二个元素对应管道的写端。
文件write()和read()函数,就可以完成数据的读写。
进程池的创建
核心代码:
for (int i = 0; i <_prcess_num; i++)
{
int pip_fd[2] = {0};
int n = pipe(pip_fd);
(void)n;
int pid = fork();
if (pid < 0)
{
std::cout << "fork_child_prcess_Failed!" << std::endl;
printf("程序对出!\n");
exit(1);
}
if (pid == 0)
{
// 子进程
close(pip_fd[1]);
Fd(pip_fd[0]);
std::cout << "子进程退出" << std::endl;
close(pip_fd[0]);
exit(1);
}
close(pip_fd[0]);
_pip_chanel.push_back(chanel(pip_fd[1], "chanel_" + std::to_string(i), pid));
}
总结
匿名管道的特点
-
常用于具有血缘关系的进程,进行IPC,常用与父子
-
单向通信
-
管道的生命周期随进程
-
面向字节流
-
管道自带同步机制
多线程
4种情况
-
写端关闭,读端一直读,就会读到0。
-
读端关闭,写端一直写,OS会终止进程。
-
写端不关闭,也不写,读端就会阻塞——同步。
-
读端不关闭,也不读,写端就会写满,不再写了。
命名管道
命名管道是文件级别的,只不过它做数据向磁盘的刷新。
命名管道的创建
#include <sys/types.h>
#include <sys/stat.h>
int mkfifo(const char *pathname, mode_t mode);
跟打开/创建一个文件一样,指名文件的路径。多一个——指名文件的权限(mode_t mode)。
命名管道的使用
跟文件使用一样的方式,先创建好命名管道,然后open,write和read操作。
共享内存
原理:就是在内存中,创建一块共享的内存空间,把这块空间分别挂接到要通信的进程。如图所示:
总结
-
匿名和命名管道是主流,共享内存被淘汰了。
-
匿名管道是单向通信,命名管道和共享内存是双向通信。
更多推荐





所有评论(0)