在创建子进程的时候,会将父进程中的资源复制一份给子进程,然后他们各自使用自己的资源,那如果父进程想与子进程通信,如何达到呢,如果说采用套接字的方法,那未免太慢了,是否可以创建一个共同使用的内存,双方都可以进行访问呢,这样子进程要给父进程的数据,放到这块内存,父进程直接拿就可以了。操作系统就实现了这种机制,来支持进程之间进行通信。

管道实现进程间通信

  操作系统为进程间通信提供了管道这一内存工具,管道属于操作系统,就像套接字一样,他是不属于进程的(进程只是拥有对应于套接字的文件描述符,而非套接字)。这样,在使用fork函数创建子进程时,就无法复制管道了。通过下列函数可以创建管道:

#include <unistd.h>int pipe(int fuledes[2]);   // 创建成功返回0,失败返回-1

父进程中调用该函数,然后通过传入一个长度为2的数组,来创建管道,分别保存用来读的文件描述符和用来写的文件描述符。一般来说,0用来读,1用来写。接下来看看具体如何使用管道:

#include <stdio.h>
#include <unistd.h>#define BUF_SIZE 30int main(int argc, char *argv[])
{int fds[2];             // 用来保存文件描述符char str[] = "hello world!";pid_t pid;pipe(fds);              // 创建管道pid = fork();if(pid == 0){write(fds[1], str, sizeof(str));}else{char buf[BUF_SIZE];read(fds[0], buf, BUF_SIZE);puts(buf);}return 0;
}

运行结果如下:

现在只是实现了单向的一个通信,那单条管道是否可以实现双向的通信呢,此处我们尝试一下:

#include <stdio.h>
#include <unistd.h>#define BUF_SIZE 30int main(int argc, char *argv[])
{int fds[2];             // 用来保存文件描述符char str1[] = "hello world!";char str2[] = "who are you?";char buf[BUF_SIZE];pid_t pid;pipe(fds);              // 创建管道pid = fork();if(pid == 0){write(fds[1], str1, sizeof(str1));read(fds[0], buf, BUF_SIZE);printf("child process output: %s \n", buf);}else{read(fds[0], buf, BUF_SIZE);printf("parent process output: %s \n", buf);write(fds[1], str2, sizeof(str2));}return 0;
}

运行结果如下:

  子进程写入消息后,子进程先将消息读取了出来,然后父进程由于其中已经没有消息可读,阻塞在read函数处。也就是说写入管道的消息,可能由于非指定对象读取,而导致被我们不想让读取的文件描述符获取到这个信息。

  当然我们可以在子进程写入消息后,为其设置一个睡眠时间,从而让父进程先读取这个消息,但是实际编程中,如果进程过多,这种设置方法未免太过耗费精力,且影响系统性能。所以我们可以通过设置两条管道,一条用来子进程读父进程写,一条用来父进程读子进程写。

#include <stdio.h>
#include <unistd.h>#define BUF_SIZE 30int main(int argc, char *argv[])
{int fds1[2], fds2[2];             // 用来保存文件描述符char str1[] = "hello world!";char str2[] = "who are you?";char buf[BUF_SIZE];pid_t pid;pipe(fds1), pipe(fds2);              // 创建管道pid = fork();if(pid == 0){write(fds1[1], str1, sizeof(str1));read(fds2[0], buf, BUF_SIZE);printf("child process output: %s \n", buf);}else{read(fds1[0], buf, BUF_SIZE);printf("parent process output: %s \n", buf);write(fds2[1], str2, sizeof(str2));}return 0;
}

运行如下:

这样就实现了进程间的双向通信。

进程通信 - 管道通信相关推荐

  1. c语言程序实现进程的管道通信,C 进程间通信--命名管道通信代码实现及其原理图示...

    在将这个题目之前大家需要了解几个概念: 进程: 我们可以先看进程的定义:进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础: ...

  2. linux下进程间管道通信,Linux下进程间通信方式-管道

    本文关键字: linux 管道通信,linux 进程通信方式,无名管道,有名管道 管道是Linux中进程间通信的一种方式,它把一个程序的输出直接连接到另一个程序的输入.Linux的管道主要包括两种:无 ...

  3. 双进程有名管道通信应用实例

    更多资料请点击:我的目录 本篇仅用于记录自己所学知识及应用,代码仍可优化,仅供参考,如果发现有错误的地方,尽管留言于我,谢谢. 要求: p1和p2两个进程通信,用有名管道实现 需要两个管道文件 第一个 ...

  4. C#进程通信 - 管道通信

    语言类型:C# 使用场景:需要使不同进程间可以进行通信 关键代码: #region Pipe/// <summary> G/S:管道接收端 </summary>private ...

  5. C#与C++进程间管道通信

    项目中需要将C++代码计算出的参数传递给C#代码做后续处理,就需要跨语言通信. 由于命名管道可以跨语言,跨平台,跨线程通信,实际上命名管道不仅可在同一台计算机的不同进程之间传输数据,甚至能在跨越一个网 ...

  6. 双进程无名管道通信应用实例

    更多资料请点击:我的目录 本篇仅用于记录自己所学知识及应用,代码仍可优化,仅供参考,如果发现有错误的地方,尽管留言于我,谢谢. 要求: ①用pipe产生一个无名管道之后,再产生两个子进程A,B ②子进 ...

  7. linux两个子进程通信,Linux c 匿名管道实例—创建两个子进程与父进程进行管道通信...

    综合: 建立两个子进程: 一个负责计算1-50000的素数 另外一个负责计算50001-100000 父进程负责存储 利用fork创建两个子进程的框架: #include #include #incl ...

  8. 进程间的通信--无名管道

    无名管道是 UNIX 系统 IPC(进程间通信)的最古老形式,所有 UNIX 系统都支持这种通信方式机制 管道的特点: 半双工,数据在同一时刻只能在一个方向上流懂 数据只能从管道的一段写入,另一端读出 ...

  9. linux管道通信题目,操作系统实训(Linux)——习题解答、例题解析、实验指导-王红-实验实验7软中断及管道通信课案.ppt...

    操作系统实训(Linux)--习题解答.例题解析.实验指导-王红-实验实验7软中断及管道通信课案.ppt 实验7 软中断及管道通信 一.实验目的(1)掌握linux系统软中断通信的实现方法.(2)掌握 ...

最新文章

  1. 【Oracle Database】数据库用户管理
  2. 【NOIP】提高组2015 神奇的幻方
  3. 图像处理之基于NCC模板匹配识别
  4. yourtour的几种链接
  5. Django入门实战【3步曲】
  6. [机器学习] XGBoost 样本不平衡问题
  7. C++(22)--继承和派生
  8. python使用缩进来体现-Python使用缩进来体现代码之间的逻辑关系。
  9. IIS启用GZip压缩
  10. linux系统交换分区的文件格式是,【简答题】Red Hat Linux中,交换分区的文件系统类型是什么,光盘文件的文件系统类型是什么?...
  11. 计算机基础知识总结(一)
  12. linux上的ds命令,使用DS-5 进行Linux应用开发
  13. python爬虫作业帮_2020高校邦《网络数据采集与Python爬虫【带实验】》课后作业参考答案2020知到《PPT创意动画》单选题答案...
  14. 微创电生理通过注册:年营收1.9亿 微创批量生产上市企业
  15. 一些看过的计算机科学专业课外书的读后感
  16. 计算机关闭dhcp,dhcp应该开启还是关闭_dhcp关闭会怎么样
  17. iframe的onload事件
  18. Markdown的常用语法(个人总结)
  19. 低代码:正在改变软件的开发方式
  20. 黑马程序员入学Java知识——精华总结

热门文章

  1. 突破!在人工染色体中存储图片和视频:天津大学元英进团队验证DNA数据存储新方法...
  2. python逻辑取反的实现
  3. android 自定义 theme,Android 系统添加自定义主题属性
  4. Window系统触摸板防误撞 - 输入文字时再也不用担心光标找不到了
  5. 骡马视频,神马视频,带TV,带影院。不用数据库的搭建教程
  6. 百达翡丽风格经典大气款式推荐
  7. 空天地一体化应急通信研究
  8. Linux cp复制文件或文件夹
  9. 12306 js刷票脚本
  10. linux依赖关系查看命令,Linux下查看依赖关系