进程学习:进程间通信(传统通信方式)1.无名管道
无名管道的特点:
1.适用场景:只能用于具有亲缘关系的两个进程之间;
2.通信模式:半双工模式,具有固定的读端(0)和写端(1);
3.读写方式:用文件io,不支持lseek;
4.读阻塞:当管道中无数据时;
写阻塞:当管道中写满数据时;
5.管道大小:无名管道大小64k;
6.管道破裂:关闭读端,仍然想管道中写入数据时;
对管道进行写的进程会收到内核发来SIGPIPE的信号,可以捕获;
来,我们用无名管道先写一个回显程序:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>#define N 32int main(int argc, const char *argv[])
{int pipefd[2];int pid;if(pipe(pipefd) < 0){perror("pipe error");exit(1);}if( (pid = fork()) < 0){perror("fork error");exit(1);}else if(pid == 0){char buf[N];int ret;close(pipefd[0]);puts("im chd start");while(fgets(buf, N, stdin) != NULL){write(pipefd[1], buf, N);if(strncmp(buf, "quit", 4) == 0){break;}}puts("im chd end");exit(2);}else if(pid > 0){int chdstatus, out_pid, ret;char buf[N];close(pipefd[1]);puts("im farther start");//父进程在这里会阻塞,应为管道的特点中有一条“当管道中无数据时,会读阻塞”,//程序启动时,如果父进程现将占到系统资源执行到这里仍然会阻塞,因为管道中没//有数据。所以父进程要想执行,必须依赖于子进程向管道中写入数据;//但是如果是读取一个文件,文件为空,此时read等于0,则不会执行while循环;//在这里主要提一下管道无数据,会读阻塞;while(read(pipefd[0], buf, N) > 0){puts("im if");if(strncmp(buf, "quit", 4) == 0){exit(1);;}fputs(buf, stdout);}puts("im farther end");out_pid = waitpid(pid, &chdstatus, 0);printf("outpid = %d\n", out_pid);if(WIFEXITED(chdstatus)){printf("exit_num = %d\n", WEXITSTATUS(chdstatus));}exit(0);}return 0;
}
下面我们用无名管道来实现一个文件服务器的功能
进程学习:进程间通信(传统通信方式)1.无名管道相关推荐
- 进程间的通信IPC(无名管道和命名管道)
进程间的通信IPC介绍 进程间通信(IPC,InterProcess Communication)是指在不同进程之间传播或交换信息. IPC的方式通常有管道(包括无名管道和命名管道).消息队列.信号量 ...
- linux pipe 命名管道,linux 进程学习笔记-named pipe (FIFO)命名管道
与"无名管道"不同的是,FIFO拥有一个名称来标志它,所谓的名称实际上就是一个路径,比如"/tmp/my_fifo",其对应到磁盘上的一个管道文件,如果我们用f ...
- 进程间通信方式(一)-- 无名管道、有名管道
文章目录 1. 进程间通信方式分类 2. 进程间通信实现方式 3. 无名管道 3.1 概念 3.2 相关函数 读写规律 3.3 无名管道实现进程间通信 4. 有名管道 4.1 概念 4.2 创建有名管 ...
- 进程间的通信——无名管道
进程间的通信--无名管道 宗旨:技术的学习是有限的,分享的精神是无限的. 一.进程间的通信 (1)同主机进程间数据交互机制:无名管道(PIPE),有名管道(FIFO).消息队列和共享内存.无名管道多用 ...
- 进程间通信之无名管道
文章目录 前言 一.创建无名管道 二.尝试在无名管道中读取 1.引入库 2.验证无名管道的内容只能读一次 三.测试无名管道能写入多少个字节 四.测试两个进程是否能通信 五.父子进程通信案例 总结 前言 ...
- linux进程通信1:进程通信概述,管道通信原理(无名管道,有名管道),管道编程实战
进程通信概述,管道通信原理(无名管道,有名管道),管道编程实战 1.进程间通信概述: 举例1: 你手机微信和别人手机微信通信 举例2: 如:父子进程wait 和 exit之间的通信 进程间通信(IPC ...
- Liunx系统编程篇—进程通信(二)无名管道(原理、创建、实战)命名管道(原理、创建、实战)
一.无名管道 管道,通常指无名管道(之所以叫无名管道是因为,没有文件名),是 UNIX 系统IPC最古老的形式. 特点 (1)它是半双工的(即数据只能在一个方向上流动),具有固定的读端和写端. (2) ...
- linux系统调用创建无名管道,无名管道系统调用
本文关键字: linux 管道通信,linux 进程通信方式,无名管道 1.管道创建与关闭说明 管道是基于文件描述符的通信方式,当一个管道建立时,它会创建两个文件描述符fd[0]和fd[1],其中fd ...
- 进程间通信六种通信方式
目录 一.管道 二.FIFO 三.消息队列 四.共享内存 五.信号 六.信号量 七.进程间通信方式总结: 进程间通信(IPC,InterProcess Communication)是指在不同进程之间传 ...
- [国嵌攻略][080][无名管道通讯]
通讯目的 1.数据传输 一个进程需要将数据发送给另外一个进程. 2.资源共享 多个进程之间共享同样的资源. 3.通知事件 一个进程需要向另外一个/组进程发送消息,通知它们发生了某事件. 4.进程控制 ...
最新文章
- 抖音、快手和直播行业的火爆究竟给了谁机会?
- YOLOv5发布第六个版本,支持一键适配OpenVINO/OpenCV DNN部署
- tc35i pdu message format
- 关于scanf 函数,你很少了解的“秘密”
- 图:活动现场双屏管理系统V3-多线程抽奖版软件,完美升级收工!历时3个月,艰辛坎坷...
- python逻辑运算符例子_python运算符-实战中常用的三个逻辑运算符使用实例
- .java中jar_java中的jar
- ZZULIOJ 1067: 有问题的里程表
- linux ac97声卡驱动下载,《声卡驱动》AC97声卡/创新/主板集成
- ISO/OSI七层网络参考模型、TCP/IP四层网络模型和教学五层网络模型
- Java 计算两个日期时间差(天数、时、分、秒、毫秒)
- Gerrit环境与代码Review实战
- 什么是React为什么使用React什么时候使用React
- 郑州共享美容院小程序开发如何操作?
- 有那些适合苹果手机用的蓝牙耳机?适合苹果手机用的蓝牙耳机推荐
- 【arcgis 批量将属性表批量导出成excel】
- cesium-视频融合
- 编写C语言程序 输出一个菱形
- 建立自己的手写笔画图案
- 业精于勤荒于嬉 行成于思毁于随