• 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 来查看系统中的共享内存段与删除相应的段。

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

  • 相关阅读:
    Akka 报错:java.net.BindException: [/?.?.?.?:25520] Address already in use: bind
    Akka 远程通信报错:ActorSelection[Anchor(akka://client/deadLetters), Path(/user/YellowChickenServer)]
    Akka启动报错:Exception in thread "main" java.lang.ClassNotFoundException: akka.remote.RemoteActorRefProvider
    IDEA 控制台输出乱码
    Akka启动时,报错:java.lang.NoClassDefFoundError: scala/Product$class
    java并发编程实践线程安全性
    在Linux创建开机自启动服务
    关联规则Apriori算法和FPTree
    git的安装及简单使用
    linux防止暴力破解
  • 原文地址:https://www.cnblogs.com/liangxing/p/1902976.html
Copyright © 2020-2023  润新知