zoukankan      html  css  js  c++  java
  • 查漏补缺:进程间通信(IPC):管道

      管道是UNIX系统IPC的最古老形式,所有UNIX系统都提供此种通信机制。管道有以下两种局限性:

      (1)历史上,管道是半双工的(即数据只能在一个方向上流动)。

      (2)管道只能在具有公共先祖的两个进程之间使用。通常,一个管道有一个进程创建,在进程调用fork之后,这个管道就能在父子进程间使用。

      管道的创建:

      管道通过调用pipe函数创建。

      头文件:#include <unistd.h>

      原型:int pipe(int fd[2])

      返回值:成功,返回0;失败,返回-1.

      经由参数fd返回两个文件描述符:fd[0]为 读而打开,fd[1]为写而打开。fd[1]的输出是fd[0]的输入。

      图解如下:

      

      测试程序:

     1 #include <stdio.h>
     2 #include <unistd.h>
     3 #include <stdlib.h>
     4 
     5 int main(int argc,char* argv[])
     6 {
     7     int n;
     8     int fd[2];
     9     pid_t pid;
    10     char buf[128] = {0};
    11 
    12     if(pipe(fd) < 0)
    13     {
    14         printf("pipe error
    ");
    15         return -1;
    16     }
    17 
    18     if((pid = fork()) < 0)
    19     {
    20         printf("fork error
    ");
    21         return -1;
    22     }
    23     else if(pid > 0)
    24     {
    25         close(fd[0]);
    26         printf("父进程ID:%d,子进程ID:%d
    ",getpid(),pid);
    27         write(fd[1],"hello world
    ",sizeof("hello world
    "));
    28     }
    29     else
    30     {
    31         close(fd[1]);
    32         n = read(fd[0],buf,sizeof(buf));
    33         printf("子进程ID:%d
    ",getpid());
    34         write(STDOUT_FILENO,"子进程:",sizeof("子进程:"));
    35         write(STDOUT_FILENO,buf,n);
    36     }
    37 
    38     return 0;
    39 
    40 }
    View Code
  • 相关阅读:
    第十六天-面向对象02-成员
    第十五天-面向对象01
    第十四天-内置函数
    第十三天-生成器
    第十二天-函数名 迭代器
    第十一天-函数进阶
    第十天-初识函数
    第九天- 文件操作 r w a 文件复制/修改
    objectives-c基本语法。
    今天开始了objective-c的学习!
  • 原文地址:https://www.cnblogs.com/lianshuiwuyi/p/7687883.html
Copyright © 2011-2022 走看看