zoukankan      html  css  js  c++  java
  • linux ipc——pipe

    1、概念

    管道:pipe,又称无名管道,是一种特殊类型的文件,在应用层体现为两个打开的文件描述符。

    它和有名管道、信号都是unix进程间通信方式。

    2、用途

    主要用于父进程与子进程之间,或者两个兄弟进程之间。

    3、特点

    7个,

    ①半双工。

    数据在同一时候只能在同一个方向流动(举例:对讲机。全双工:手机,单工:遥控器)

    ②只存在于内存当中。

    不是个普通的文件,不属于于文件系统(与普通文件的区别:无法通过open、close、read、write来操作管道文件,只能通过继承来获取文件描述符)

    ③没有名字。

    只能在具有公共祖先的进程之间使用

    ④缓冲区大小固定。

    linux中,管道的缓冲区大小事4kb。

    ⑤传输的数据时无格式的。

    故要求读写双方约定数据格式、大小

    ⑥数据只能从管道一端读,一端写。

    ⑦读数据为一次性操作,一旦读走,数据被抛弃,释放空间。

    4、使用方法

    #include <unistd.h>
     int pipe(int fd[2]);
     功能:经由参数fd返回两个文件描述符
     参数:
    fd为int型数组的首地址,其存放了管道的文件描述符fd[0]、fd[1]。
    fd[0]为读而打开,fd[1]为写而打开管道
     返回值:
     成功:返回 0
     失败:返回-1

    5、举例

    #include <stdio.h>
    #include <string.h>
    #include <unistd.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <sys/wait.h>

    int main(int argc, char *argv[])
    {
     int fd_pipe[2];
     char buf[] = "hello world";
     pid_t pid;
     
     if (pipe(fd_pipe) < 0)
        perror("pipe");
     pid = fork();
     if (pid < 0)
     {
      perror("fork");
      exit(-1);
     }
     if (pid == 0)
     {
      write(fd_pipe[1], buf, strlen(buf));
      _exit(0);
     }
     else
     {
      wait(NULL);
      memset(buf, 0, sizeof(buf));
      read(fd_pipe[0], buf, sizeof(buf));
      printf("buf=[%s]\n", buf);
     }
     return 0;
    }

  • 相关阅读:
    JVM学习-垃圾回收算法
    JVM学习-jvm判断对象已死的方法
    JVM学习-jvm内存区域
    python 多线程
    Python+unittest+requests+excel实现接口自动化测试框架
    linux 运行tensorflow文件缺少_bz2问题及解决
    获取url地址
    微信小程序的小问题(2)
    微信小程序的小问题(1)
    前端知识
  • 原文地址:https://www.cnblogs.com/kunyashaw/p/3118654.html
Copyright © 2011-2022 走看看