• IPC(1)-管道


    1 概括介绍

         管道分为无名管道和有名管道。

    2 无名管道

         是 UNIX 系统IPC最古老的形式。有如下的特点:

        1:半双工的,数据只能在一个方向上传输,有固定的读端和写端。

        2:只能用于具有亲缘关系的进程之间的通信(也是父子进程或者兄弟进程之间)。

        3:可以看成是一种特殊的文件,对于它的读写也可以使用普通的read、write 等函数。但是它不是普通的文件,并不属于其他任何文件系统,并且只存在于内存中。

    3 实例

    3.1 涉及函数

    #include <unistd.h>
    int pipe(int fd[2]);/*返回值:若成功返回0,失败返回-1*/

    当一个管道建立时,会创建两个文件描述符:fd[0]为读而打开,fd[1]为写而打开。要关闭管道只需将这两个文件描述符关闭即可。

    3.2 实例

    如果从父进程发送数据到子进程,则关闭父进程的读端(fd[0])与子进程的写端(fd[1]);反之,则可从子进程发送数据到父进程。

     1 #include <stdio.h>
     2 #include <unistd.h>
     3 #include <string.h>
     4   
     5 int main()
     6 {
     7      int fd[2];  /*两个文件描述符*/
     8      pid_t pid;
     9      char buf_f[20];
    10      char buf_b[20];
    11      memset(buf_f,0,sizeof(buf_f));
    12      memset(buf_b,0,sizeof(buf_b));
    13      if(pipe(fd) < 0)  /*创建管道*/
    14      {
    15          printf("Create Pipe Error!
    ");
    16      }
    17      if((pid = fork()) < 0)  /*创建子进程*/
    18      {
    19        printf("fork Error!
    ");
    20      }
    21      else if(pid > 0)  /*父进程*/
    22      {
    23        close(fd[0]); /*关闭读端*/
    24        buf_f = "hello boy,I'm father!!!";
    25        write(fd[1], buf_f, 12);
    26      }
    27      else
    28      {
    29        close(fd[1]); /*关闭写端*/
    30        read(fd[0], buf_b, 20);
    31        printf("%s 
    ", buf_b);
    32      }
    33      return 0;
    34 }
    4 有名管道
    主要用于非父子的进程间通信。
    实例:
    4.1 写端:
     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 #include <string.h>
     4 
     5 int main()
     6 {
     7   int fd = open("pipe_file",O_WRONLY);
     8 
     9   printf("fd = %d
    ",fd);
    10 
    11   char buf[64] = {0};
    12   while(1)
    13   {
    14     printf("plase input:
    ");
    15     fgets(buf,64,stdin);
    16     write(fd,buf,strlen(buf));
    17 
    18     if(strncmp(buf,"end",3)==0)
    19     {
    20       break;
    21     }
    22   }
    23   close(fd);
    24   return 0;
    25 }

    4.2  读端

     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 #include <string.h>
     4 
     5 int main()
     6 {
     7   int fd = 0;
     8 
     9   int sum = 0;
    10 
    11   char buf[64] = {0};
    12 
    13   fd = open("pipe_file",O_RDONLY);
    14   printf("fd = %d
    ",fd);
    15 
    16   do
    17   {
    18 
    19     sum = read(fd,buff,64))
    20 
    21     memset(buf,0,64);
    22     printf("read:(n = %d)%s
    ",n,buff);
    23   }while(sum);
    24 
    25   close(fd);
    26   return 0;
    27 }
    行胜于言,自强不息。
  • 相关阅读:
    VINS_Fusion 框架
    VINS_Fusion 前端源码解析
    堆与优先队列
    LSD-SLAM简介
    直接法和特征点法的区别与优缺点
    CV::Mat介绍
    C++ 位运算
    OPENCV重要函数
    C++ 优先队列
    特征点法的巅峰之作—ORBSLAM2
  • 原文地址:https://www.cnblogs.com/xinghuo123/p/11946120.html
Copyright © 2020-2023  润新知