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

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

  • 相关阅读:
    统计难题(字典树 模版题)
    hadoop2.2.0集群安装
    HDU 3068 回文串--Manacher
    Poj 3974 回文串--Manacher
    word模版另存为网页(*.htm,*.html),转为jsp页面并加入数据后导出成word
    OpenCV——字符提取并保存
    直线检测
    图像切边
    OpenCV 中轮廓包裹的几个函数boundingRect、minAreaRect、minEnclosingCircle用法
    使用级联分类器实现人脸检测(OpenCV自带的数据)
  • 原文地址:https://www.cnblogs.com/liangxing/p/1902976.html
Copyright © 2011-2022 走看看