文章目录

  • 题目描述
  • 代码实现
  • 关于pipe函数
  • 关于读写操作
  • 关于读写端口
  • 关于wait函数
    • 功能:
    • 注意:
  • 关于fork函数

题目描述

编写一个程序,利用管道实现父子进程的通信,父进程向子进程发送信息,由子进程输出显示。

代码实现

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>  //管道功能所在的头文件
#include <sys/types.h>  //wait函数所在的头文件
#include <sys/wait.h>  //wait函数所在的头文件#define MAXLINE 80int main()
{int n;  //所发送消息的长度int fd[2];  //管道读写端口pid_t pid;  //进程号char line[MAXLINE];  //消息缓冲区if(pipe(fd) < 0) //建立管道不成功{perror("pipe");exit(1); //有错误型的退出}if((pid = fork()) < 0) //建立子进程不成功{perror("fork:");exit(1);}else  //成功建立子进程{ if(pid > 0)  //父进程{close(fd[0]);  //关闭读端write(fd[1],"I love CMY!\n", 12);  //把"I love CMY!\n"长度为12的字符送到管道写端口fd[1]close(fd[1]);   //关闭写端,老师是要求写完之后要关闭的,但是我试了试不写也没啥问题……wait(NULL);  //父进程等待子进程结束}else  //子进程{close(fd[1]);  //关闭写端n = read(fd[0], line, MAXLINE);  //从管道读端口fd[0]把长度为MAXLINE的字符送到line中write(STDOUT_FILENO, line, n);  //将line中长度为n的字符写到标准输出设备(即屏幕上)close(fd[0]);  //同上,关闭读端,老师是要求写完之后要关闭的,但是我试了试不写也没啥问题……}    }return 0;
}

关于pipe函数

功能:创建一个普通管道


关于读写操作

也就是说读/写操作的流程是:

  • 关闭读/写端
  • 进行写/读操作
  • 写/读完关闭写/读端

关于读写端口

为什么fd[0]是读,fd[1]是写,能不能颠倒过来?

一般来讲,我们常说:读写读写,不说写读写读,因为不顺口。所以0是读,1是写,你要是想颠倒也是可以的,只要你自己记得住就行。


关于wait函数


功能:

父进程一旦调用了wait就立即阻塞自己,由wait自动分析是否当前进程的某个子进程已经退出,如果让它找到了这样一个已经变成僵尸的子进程,wait就会收集这个子进程的信息,并把它彻底销毁后返回;如果没有找到这样一个子进程,wait就会一直阻塞在这里,直到有一个出现为止。

注意:

当父进程没有用wait()函数等待已终止的子进程时,子进程就会进入一种无父进程的状态,此时子进程就是僵尸进程。
如果先终止父进程,子进程依然会继续正常进行,只是它将由init进程(PID 1)继承,当子进程终止时,init进程捕获这个状态。


关于fork函数

其实本题就是管道和父子进程的相结合,重点是理解fork()之后父子进程的并行执行,以老师PPT中的例题为例:

子进程执行的是 val == 0 的内容,而父进程执行的是 val > 0 的内容,子进程创建的时候完全复制了父进程的资源,可以理解为自 val = fork() 之后,代码就被copy了一份一摸一样的,父进程执行被copy的,子进程执行copy的。而对于本题而言,从

if((pid = fork()) < 0) //建立子进程不成功

开始,子进程copy了后面的代码,而且继承了父进程之前的资源,如变量等,然后在接下来的代码中根据pid的不同进入不同的代码段。

值得注意的是,本题代码中先处理的是父进程的写操作,再处理的是子进程的读操作,那如果反过来先写子进程的读操作,再写父进程的写操作,代码还可以正常运行吗?

经过测试,答案是可以,因为我们刚讲过他们俩是并行执行嘛,但是根据先写进去再读出来比较符合人类的思维,所以我们本题就先写父进程的写操作,再处理子进程的读操作~

证据如下图:

管道实现父子进程的信息传递(一)【fork函数、pipe函数、write/read操作、wait函数】相关推荐

  1. 管道实现父子进程的信息传递(二)【标准流和其文件描述符、fwrite函数、perror函数】

    文章目录 代码实现 标准流 和 标准流文件描述符 代码中用到的函数 fwrite() perror() 在复习进程间的通信方式时又写了一遍,和 管道实现父子进程的信息传递(一)[fork函数.pipe ...

  2. 进程间数据传递:Queue,Pipe 进程间数据共享:Manager

    进程间数据传递:Queue,Pipe 进程间数据共享:Manager 1.使用multiprocessing模块的Queue实现数据传递 ''' 进程间通讯:Queue,用法跟线程里的Queue一样, ...

  3. 无名管道-----实现父子进程相互通信

    创建一条无名管道并且给你两个文件描述符(读写的文件描述符) pipefd[0]:读端 pipefd[1]:写端 思路: 只需要一个.c即可,fork一次即可(因为用的是无名管道) 注意: 父进程: 发 ...

  4. 利用管道实现父子进程读写数据

    #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/wait.h ...

  5. 命名管道实现进程的信息传递【mkfifo函数、open函数】

    文章目录 代码实现 mkfifo函数 open函数 代码实现 #include<fcntl.h> // open() #include<sys/wait.h> // wait( ...

  6. 5.8fork父子进程

    实验4-2:fork父子进程 实验目的: 理解fork创建子进程的本质 实验要求: 1.按如下要求编写程序: (1).打开一个有内容的文件; (2).调用fork创建子进程; (3).读文件的第一个字 ...

  7. linux c之通过管道父子进程实现同步通信

    1.父进程向子进程写数据 进程的概念和父进程向子进程写数据,我们之前有一片博客介绍过  http://blog.csdn.net/u011068702/article/details/54914774 ...

  8. 2.12父子进程通过匿名管道通信

    目录 1.pipe函数 2.查看管道缓冲大小 1.pipe函数 #include <unistd.h> int pipe(int pipefd[2]);功能:创建一个匿名管道,用来进程间通 ...

  9. Linux中父子进程、兄弟子进程之间通信方式--匿名管道pipe(适用于有血缘关系的进程)

    文章目录 编程环境: 进程间通信 IPC: 匿名管道(pipe): 父子进程间通信: 兄弟子进程间通信: 管道的读写行为: 读操作: 写操作: 查看管道缓冲区大小: 设置管道的非阻塞属性: 下载地址: ...

最新文章

  1. 2016年,新的开始
  2. hystrix是什么?
  3. (2)通信中为什么要进行AMC?
  4. python需要配置环境变量吗_python为什么会环境变量设置不成功
  5. Glide-Android下高效加载多媒体文件
  6. STM32F407 窗口看门狗 个人笔记
  7. 路由器总是有信号无网络连接到服务器,路由器信号满格但是没有网络怎么办
  8. elixir 简单的server,client
  9. SUN进入RFID中间件市场 Linux版本今秋发售
  10. latex如何打空格
  11. 什么叫域名解析SSL证书?
  12. Win10台式电脑网线正常但连不上网。
  13. IONIC中slides的使用(图片显示及其删除)
  14. Mybatis常见面试问题(附答案)
  15. echarts 显示隐藏后宽度高度变小问题
  16. html制作菱锥旋转,怎样用几何画板实现三棱锥的旋转
  17. 关于%(取余)和 /(取整)的解释
  18. SMARTFORM A5单据打印(自定义纸张/针式打印机)格式问题
  19. 巴菲特弃用 20 美元的三星翻盖,换上了 iPhone
  20. 常见的三维人体模型有哪些?如SMPL

热门文章

  1. macbook不能进系统 备份数据_不基于备份和表,生产系统数据误删就能完全恢复?!...
  2. python内存消耗大吗_如何减少python内存的消耗?
  3. x86服务器当虚拟化的存储,龙存科技-软件定义数据中心产品提供商
  4. xLite连接asterisk提示sip408错误
  5. VxWorks系统BSP配置文件及生成下载
  6. 高斯投影坐标系为什么是六七八位数
  7. ASP.NET MVC 入门1、简介
  8. 第二节: 比较EF的Lambda查询和Linq查询写法的区别
  9. 第十七节:易混淆的概念(静态和非静态、拆箱和装箱)
  10. ELK Stack 与 Elastic Stack 的异同点