• APUE 读书笔记 Chapter 15 Interprocess Communication


    Pipe:
    历史原因,造成管道是半双工的,有一些系统的管道已经实现全双工了。管道可以在拥有同一个祖先进程的进程之间进行通信,较常用于父进程与子进程之间的通信。
    pipe(3)会返回两个文件描述符,其中,fd[0]表示读接口,fd[1]表示写接口,通常每个进程会根据自己的地位与需要,关闭相应的描述符,以达到管道的功能与目的。
     
     
    popen可以产生一个管道,并且fork一个子进程,并调用shell,运行程序,其中,type可以指定为"r"或者"w",以父进程的角度,是从管道中读还是从管道中写,确定type的值.
    对管道使用标准I/O时,需要注意,管道是使用全缓冲的,必要时,需要修改缓冲模式。
    对管道使用select或者poll的时候要注意,select是无法生效的,除非已经映射到0,1,2的描述符中,poll可以正常使用.
    FIFO:
    FIFO又叫做命名管道,可以在不同进程间进行通信,通过使用一个进程间都知道的文件路径。经过mkfifo这个函数,创建FIFO,进程通过使用文件操作函数,打开这个文件,进行通信。
    主要的应用场景是进行服务器端与客户端的通信,但如果写向没有读端的
    IPC:
    信号量:
    信号量主要充当一个计数器的作用,通常与共享内存一起使用,主要用法相似。使用semget函数来创建或者获取
    信号量。可以指定有几个信号量,在不同系统下,信号量的可用最大值有一定的区别。使用semctl来操作信号量,也可以使用semop来批量保持原子性地操作信号量。其中,使用中必须注意的一个是,semctl的最后一个参数的结构体semun需要自己在程序中定义,
    union   semun
    {
        int   val;
        struct   semid_ds   *buf;
        unsigned   short   int   *array;
    };
     共享内存:
    使用shmget这个函数来创建,或者获取shared memory的id。要创建的话,需要带上IPC_CREAT的参数。定义一个共同知道的key值。
    通过使用shmat函数来attach共享内存段,使用shmdt函数来detach共享内存段。
    使用shmctl函数,可以获取共享内存的信息,修改及删除共享内存段。
    在shell下,可以使用命令 ipcs -m 与 ipcrm -m 来查看系统中的共享内存段与删除相应的段。

    这一章还是主要以代码练习为主,几种通信方式都很重要,需要再深度学习,加强。

  • 相关阅读:
    winform窗体扁平化设置,窗体移动,关闭
    WPF按钮控件模板
    C#连接Sqlite报错:{"试图加载格式不正确的程序。 (异常来自 HRESULT:0x8007000B)"}
    C#SQLite使用教程笔记
    C#自定义控件导航菜单(自定义事件,属性)
    LCS局域网屏幕监控系统安装指导
    System.Data.SQLite.dll 未安装或者版本冲突,按下面步骤操作即可 1、从Nuget卸载所有项目的System.Data.SQLite.dll 和SqlSugar,检查引用中是否还存在,存在直接删掉引用,然后Nuget重新安装即可
    C#项目脱落NuGet
    JavaScript跨域总结与解决办法
    回流与重绘:CSS性能让JavaScript变慢?
  • 原文地址:https://www.cnblogs.com/liangxing/p/1902976.html
Copyright © 2020-2023  润新知