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
  • 相关阅读:
    《Java入门第三季》第一章 异常与异常处理
    c++第三十一天
    《Java入门第二季》第五章 阶段练习
    《Java入门第二季》第四章 多态
    《Java入门第二季》第三章 继承
    WinForm 使用皮肤,且单击按更换皮肤。
    ExecuteReader: CommandText 属性尚未初始化
    用户登录模块--代码
    abstract 关键字-- 抽象
    Winform TabControl控件使用
  • 原文地址:https://www.cnblogs.com/lianshuiwuyi/p/7687883.html
Copyright © 2011-2022 走看看