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

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

  • 相关阅读:
    若依启动非常慢
    【转】上火了一吃就好的食物
    实型输入控制
    【转】中国地理的几个概念
    如何在阅读邮件时时保留原有html格式正文的样式
    好的代码不是设计出来的,而是重构出来的
    .net用OLEDB方式操作SqlServer和Sybase
    悬浮框实现
    C#操作xml SelectNodes,SelectSingleNode总是返回NULL 与 xPath 介绍
    ODBC驱动重新注册
  • 原文地址:https://www.cnblogs.com/liangxing/p/1902976.html
Copyright © 2011-2022 走看看