目录

进程间通信

匿名管道

匿名管道的创建和使用

进程池的创建

总结

匿名管道的特点

4种情况

命名管道

命名管道的创建

命名管道的使用

共享内存

总结


只有认知的突破💫才能带来真正的成长💫编程技术的学习💫没有捷径💫一起加油💫 

🍁感谢各位的观看🍁欢迎大家留言🍁咱们一起加油🍁努力成为更好的自己🍁

进程间通信

匿名管道

匿名管道是内存级别的文件,它适用于血缘关系的进程。如下图所示:

匿名管道的创建和使用

创建函数: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操作。

共享内存

原理:就是在内存中,创建一块共享的内存空间,把这块空间分别挂接到要通信的进程。如图所示:

总结

  • 匿名和命名管道是主流,共享内存被淘汰了。

  • 匿名管道是单向通信,命名管道和共享内存是双向通信。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐