zoukankan      html  css  js  c++  java
  • 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 来查看系统中的共享内存段与删除相应的段。

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

  • 相关阅读:
    第一节:SpringMVC概述
    SpringMVC【目录】
    Windows 系统快速查看文件MD5
    (error) ERR wrong number of arguments for 'hmset' command
    hive使用遇到的问题 cannot recognize input
    Overleaf支持的部分中文字体预览
    Understanding and Improving Fast Adversarial Training
    Django2实战示例 第十三章 上线
    Django2实战示例 第十二章 创建API
    Django2实战示例 第十一章 渲染和缓存课程内容
  • 原文地址:https://www.cnblogs.com/liangxing/p/1902976.html
Copyright © 2011-2022 走看看