11月1日笔记并发2_IPC_管道

1.IPC Internal Processes Communication
    进程间通信

    进程间进行数据交换

    可以直接定义一个全局变量?
    不可以,因为进程间的地址空间是独立

    所以 如果两个进程要进行通信,必须把数据放在一个

   双方都可以访问地方

    文件 可以
        文件在文件系统(硬盘),大家都可以访问
        但是速度太慢了
    
    =》
        在操作系统内核中开辟一块空间(某种机制),进程去访问它
        IPC 方式
            管道
                pipe 无名管道
                FIFO 有名管道

            信号
                signal
            
            消息队列
                    System V消息队列/POSIX消息队列
            信号量
                    System V 信号量/POSIX 信号量
            共享内存
                    System V 共享内存/POSIX 共享内存

            socket 通信:unix域协议


2.管道
    很久以前 进程间通信确实依赖文件
        这种方式速度实在太慢了
        好处是 简单 直接使用文件IO的API函数就可以了
    
    除了文件 OS的内存区域也是大家都可以通过OS去访问
      能不能把通信的数据放在内核中呢?
    
    管道:管道文件 虽然是个文件 但是内存是在内存中的
               而且无名管道是没有Inode节点的

    无名管道:内容在内核中 在文件系统中没有indoe节点(没有名字)


    pipe 在创建是 在内核开辟了一块缓冲区 做位pipe的内容
    的存储空间,同时返回两个文件描述符(一个用来读 一个用来写)

    它有一下特点
        (1)pipe有两端 一端是用来读 一端是用来写
        (2)按顺序读,不支持lseek
        (3)内容读走了 就没有了
        (4)pipe(无名管道)随内核持续性

    既然说管道是一个文件 意味着
    可以通过系统IO去读写管道文件
        open
        read
        write
        close

    open 不能去打开一个无名管道,open的第一参数就是文件名
            没有名字怎么打开?
    
    这个有一个新的API 
    pipe 创建一个无名管道

    NAME
        pipe, pipe2 - create pipe

    SYNOPSIS
        #include <unistd.h>

        int pipe(int pipefd[2]);

     int pipefd[2]:数组
                pipefd[0] 保存的文件描述符
                pipefd[1] 保存的文件描述符
            返回值
                成功返回0
                失败返回 -1 同时errno被设置
    
    思考
        1.pipe是不是任意两个进程都可以用pipe通信?
            或者只能用于父子进程间通信

            原则上来说
                只要两个进程能获取同意pipe的文件描述符
                就可以用pipe进行通信
        
        2.pipe本身是全双工!但是如果用一个管道去实现通信
            就必须通过某种方式去同步 不然,就很有可能读到
            自己写的数据!通常在工程中项目中,一般做成两个或
            更多的管道来显现全双工


    pipe 一般而言 只能用于有“亲缘关系”的进程通信
    它为什么有这个限制?
        pipe本身需要文件描述符去读写
        但是没有名字 open函数用不了
        那如果有一个名字

        假设它在文件系统中有一个名字(inode),它就可以
        轻松的用于任意间进程通信
    
    fifo 有名管道


3.FIFO有名管道
    fifo 是在 pipe 的基础上 在文件系统上创建了一个inode节点
    注意! fifo的inode节点实在文件系统上面的,但是
                它所有的内容都在内核中
        fifo 的文件随文件系统持续性
        fifo 的内容存在内核中的 随内核持续性

    实质上 fifo和pipe没有区别 只不过是多了一个名字

    一旦有了名字 就可以open了    fife的创建  mkfifo

    NAME
        mkfifo, mkfifoat - make a FIFO special file (a named pipe)

    SYNOPSIS
        #include <sys/types.h>
        #include <sys/stat.h>

        int mkfifo(const char *pathname, mode_t mode);

    const char *pathname: 要创建fifo的文件名 带路径 不要创建在共享文件夹下 那是windows的文件系统
        mode_t mode: 文件权限
                    1.S_IRUSR....
                    2.0666

            返回值
                成功返回0
                失败返回-1,同时errno被设置



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值