1. #include <unistd.h>
  2. #include <sys/types.h>
  3. #include <sys/wait.h>
  4. #include <errno.h>
  5. #include <string.h>
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. int main( )
  9. {
  10. pid_t pid1,pid2;
  11. int pipe_fd[];
  12. char w_buffer[],r_buffer[];
  13. int len1,len2;
  14. /*创建一个管道*/
  15. if(pipe(pipe_fd)<)
  16. {
  17. printf("pipe create error\n");
  18. return -;
  19. }
  20. /*创建子进程*/
  21. if((pid1=fork( ))==) // 子进程1执行序列
  22. {
  23. close(pipe_fd[]); // 子进程先关闭管道的读段
  24. sprintf(w_buffer,"child 1 process is sending message!");
  25. len1 = strlen(w_buffer);
  26. write(pipe_fd[],w_buffer,); /*向管道写长为len字节的串*/
  27. exit();
  28. }
  29. else if(pid1>) // 父进程执行序列
  30. {
  31. waitpid(pid1,NULL,); // 同步1--等子进程1先写完
  32. if((pid2=fork( ))==) // 子进程2执行序列
  33. {
  34. close(pipe_fd[]); // 子进程先关闭管道的读段
  35. sprintf(w_buffer,"child 2 process is sending message!");
  36. len2 = strlen(w_buffer);
  37. write(pipe_fd[],w_buffer,);
  38. exit();
  39. }
  40. else if(pid2>) // 父进程执行序列
  41. {
  42. waitpid(pid2,NULL,); // 同步2--再等子进程2写完
  43. close(pipe_fd[]); // 父进程先关闭管道的写段
  44. /*从管道中读固定长度字节的串*/
  45. if(read(pipe_fd[],r_buffer,)>)
  46. printf("%s\n",r_buffer);
  47. if(read(pipe_fd[],r_buffer,)>)
  48. printf("%s\n",r_buffer);
  49. exit();
  50. }
  51. }
  52. return ;
  53. }
  54. // waitpid 函数,等待子进程运行完毕,父进程才可以运行。
  55. // 由于fork函数让子进程完整地拷贝了父进程的整个地址空间,所以子进程都有管道的读端和写端。
  56. // 所以在相关进程中最好关掉不用的那一端。
  57. // 根据要求,“父进程先接收子进程P1发来的消息,然后再接收子进程P2发来的消息。”
  58. // 存在两个同步问题,两个子进程和父进程之间(先子写后父读)、子进程1和子进程2之间(先1写,再2写)

Linux环境下实现管道通信-问题的更多相关文章

  1. 由一个简单需求到Linux环境下的syslog、unix domain socket

    本文记录了因为一个简单的日志需求,继而对linux环境下syslog.rsyslog.unix domain socket的学习.本文关注使用层面,并不涉及rsyslog的实现原理,感兴趣的读者可以参 ...

  2. 关于ARP攻击的原理以及在Kali Linux环境下的实现

    关于ARP攻击的原理以及在Kali Linux环境下的实现 全文摘要 本文讲述内容分为两部分,前半部分讲述ARP协议及ARP攻击原理,后半部分讲述在Kali Linux环境下如何实现ARP攻击以及AR ...

  3. 多线程编程之Linux环境下的多线程(三)

    前面两篇文章都讲述了Linux环境下的多线程编程基础知识,也附带了典型实例.本文主要比较一下Linux环境与Windows环境下的多线程编程区别. 看待技术问题要瞄准其本质,不管是WIN32.Linu ...

  4. 多线程编程之Linux环境下的多线程(二)

    上一篇文章中主要讲解了Linux环境下多线程的基本概念和特性,本文将说明Linux环境下多线程的同步方式. 在<UNIX环境高级编程>第二版的“第11章 线程”中,提到了类UNIX系统中的 ...

  5. 【转载】linux环境下tcpdump源代码分析

    linux环境下tcpdump源代码分析 原文时间 2013-10-11 13:13:02  CSDN博客 原文链接  http://blog.csdn.net/han_dawei/article/d ...

  6. linux环境下tcpdump源代码分析

    Linux 环境下tcpdump 源代码分析 韩大卫@吉林师范大学 tcpdump.c 是tcpdump 工具的main.c, 本文旨对tcpdump的框架有简单了解,只展示linux平台使用的一部分 ...

  7. Linux环境下Hadoop集群搭建

    Linux环境下Hadoop集群搭建 前言: 最近来到了武汉大学,在这里开始了我的研究生生涯.昨天通过学长们的耐心培训,了解了Hadoop,Hdfs,Hive,Hbase,MangoDB等等相关的知识 ...

  8. Linux 环境下 网络IO模型

    本文讨论的背景是Linux环境下的network IO. IO发生时涉及的对象和步骤: 对于一个network IO (这里我们以read举例),它会涉及到两个系统对象,一个是调用这个IO的proce ...

  9. PHP 命令行模式实战之cli+mysql 模拟队列批量发送邮件(在Linux环境下PHP 异步执行脚本发送事件通知消息实际案例)

    源码地址:https://github.com/Tinywan/PHP_Experience 测试环境配置: 环境:Windows 7系统 .PHP7.0.Apache服务器 PHP框架:ThinkP ...

随机推荐

  1. 用RPM包安装MySQL的默认安装路径问题

    在安装PHP时候要对一些配置选项进行设置,其中就有:--with-mysql[=DIR]:包含MySQL扩展,[=DIR]指定mysql安装目录,省略[=DIR]则为默认位置/usr--with-my ...

  2. Java的++自增

    记得大学刚开始学C语言时,老师就说:自增有两种形式,分别是i++和++i,i++表示的是先赋值后加1,++i是先加1后赋值,这样理解了很多年也没出现问题,直到遇到如下代码,我才怀疑我的理解是不是错了: ...

  3. PageBean分页组件

    Page.java package org.guangsoft.bean; import java.util.List; public class Page { private int current ...

  4. Stanford大学机器学习公开课(六):朴素贝叶斯多项式模型、神经网络、SVM初步

    (一)朴素贝叶斯多项式事件模型 在上篇笔记中,那个最基本的NB模型被称为多元伯努利事件模型(Multivariate Bernoulli Event Model,以下简称 NB-MBEM).该模型有多 ...

  5. struts2的s:iterator 标签 详解

    s:iterator 标签有3个属性:value:被迭代的集合id   :指定集合里面的元素的idstatus 迭代元素的索引1:jsp页面定义元素写法 数组或list <s:iterator ...

  6. .NET委托解析

    委托这个概念其实我们都很熟悉了,但是在使用的时候很多人还是无法去把控它,我们可以试想一下,在平时编码的时候,你是直接按照业务逻辑直接创建类,new出一个对象来进行操作的还是说有用到委托来更高效的完成一 ...

  7. hdu 1012:u Calculate e(数学题,水题)

    u Calculate e Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tot ...

  8. wp8 入门到精通 动画

    http://samples.msdn.microsoft.com/Silverlight/SampleBrowser/index.htm#/?sref=transforms_ovw_animatin ...

  9. c++ 复习内容

    . ]) { sizeof(str)=? } :// 函数行参仅是一个指针 . Typedef struct s* tPs; tPs p3,p4;//相等 struct s*p3,struct s*p ...

  10. hdu 4001 dp 2011大连赛区网络赛A

    题意:给一些指定长宽高的砖,求能累出的最大高度,不同砖有不同编号,每种编号对下面的砖做出了限制 dp 注意输出要用%I64d,否则会wa,以后不用%lld了 Sample Input 3 10 10 ...