无名管道读写特点|学习笔记

简介: 快速学习无名管道读写特点

开发者学堂课程【物联网开发- Linux 高级程序设计全套视频无名管道读写特点 】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/660/detail/11028


无名管道读写特点

 

内容介绍

一、从管道中读写数据的特点

二、验证一

三、验证四

四、验证三

 

一、从管道中读写数据的特点

1、默认用read函数从管道中读数据是阻塞的

在读数据的过程中,若无名管道内无数据,就会停在读;待有数据后继续执行。

2、调用write函数向管道里写数据,当缓冲区已满时write也会阻塞。

当管道满了之后,就会停在当前的位置;有空间后继续执行

3、通信过程中,读端口全部关闭后,写进程向管道内写数据时,写进程会(收到SIGPIPE)退出

父进程创建一个子进程,若父子进程都将读端关闭,则没有进程在读东西。

编程时我们可以设置阻塞非阻塞(read默认阻塞,write也是阻塞的)

看一下其中的特点

编程时可通过fcntl函数设置文件的阻塞特性

设置为阻塞:

Fcntl(fd,F-setfl,0);

设置非阻塞:

Fcntl(fd,-setfl,O-NONBLOCK);

(将读端或者写端的文件描述符写入,NONBLOCK指非阻塞)

如果将读端设置为非阻塞,没有数据的时候也不会阻塞;

如果将写端设置为非阻塞,写满了就不能再写,但不会阻塞。

 

二、验证一

来看一个例子:

验证无名管道文件读写的阻塞和非阻塞

(我们只写一句话,之后不停的对此进行读取,如果没有数据,那么read就会带阻塞)

#include <stdio.h>

#include‹string.h>

#include<unistd.h>

#include‹stdlib.h>

#include <sys/twpes.h>

#include<sys/wait.h>

#include <fcntl.h>

注意需要包括以上图文件

int main (int argc, char *argv[])

int fd pipe[2];

首先我们定义一个数组,用来作为管道的读写端号

char buf[]=“hello world ”(定义一个字符数组,存放hello world;注意 buf是12个字节,)

pid_t pid;

首先进来需要创建管道,然后管道的读端和写端保存在数组里面

if (pipe (fd pipe) < 0)

perror ("pipe") ;

pid=fork();(创建子进程)

if (pid< 0)

{

perror ("fork") ;

exit (-1);

}

if (pid==0)

{

Sleep(3);(3秒之后write)

write(fd_pipe[1],buf,strlen(buf)) ;(strlen测试写了多少个字节进去)

_exit (0) ;

}

else

{

//fcntl(fd_pipe[0],F_SETFL,O_NONBLOCK);

fcntl设置管道的读端,默认第三个数据传0是阻塞的

fcntl (fd pipe[0], F_SETFL, 0) ;

while (1)(循环)

{

memset (buf, 0, sizeof (buf)) ;(先清空buf)

read (fd pipe[0], buf,sizeof (buf) ) ;(从管道的读端开始读东西)

print ("buf=[%s] \n", buf) ;(3秒后读到数据打印出来)

sleep (1) ;

延时1秒再去读,但是子进程已经退出,父进程一直阻塞在read上

}

}

Return 0;

 

三、验证二

调用 write 函数向管道里写数据,当缓冲区已满时write也会阻塞(在管道中写数据,如果写满了write在阻塞)。

更改进程:

父进程只读一次(读到之后打印出来),在while循环上。

子进程while(1)在不断的输入内容,每写完一次都i++,printf(“i=%d\n”,d)

此管道早晚都会被子进程写满,写满之后write堵塞,i就不打印了。

 

四、验证三

通信过程中,读端口全部关闭后,写进程向管道内写数据时,写进程会(收到SIGPIPE)退出

image.png

更改进程:

父进程先去读一次数据,之后close(fd-pipe[0]);//关闭读端

子进程也需要关闭读端,之后循环write;一秒钟写一次;读不到数据就一直停在当前。

需要将所有的读端关掉

相关文章
|
C++
基于Qt的简易文本编辑器设计与实现
基于Qt的简易文本编辑器设计与实现
421 1
|
存储 人工智能 算法
AI与大数据的结合:案例分析与技术探讨
【8月更文挑战第22天】AI与大数据的结合为各行各业带来了前所未有的机遇和挑战。通过具体案例分析可以看出,AI与大数据在电商、智能驾驶、医疗等领域的应用已经取得了显著成效。未来,随着技术的不断进步和应用场景的不断拓展,AI与大数据的结合将继续推动各行业的创新与变革。
|
10月前
|
C语言 C++ 容器
【c++丨STL】string模拟实现(附源码)
本文详细介绍了如何模拟实现C++ STL中的`string`类,包括其构造函数、拷贝构造、赋值重载、析构函数等基本功能,以及字符串的插入、删除、查找、比较等操作。文章还展示了如何实现输入输出流操作符,使自定义的`string`类能够方便地与`cin`和`cout`配合使用。通过这些实现,读者不仅能加深对`string`类的理解,还能提升对C++编程技巧的掌握。
410 5
|
11月前
|
存储 编译器 C语言
C语言:文件缓冲区刷新方式有几种
C语言中文件缓冲区的刷新方式主要包括三种:自动刷新(如遇到换行符或缓冲区满)、显式调用 fflush() 函数强制刷新、以及关闭文件时自动刷新。这些方法确保数据及时写入文件。
|
11月前
|
Python
在Python中实现斐波那契数列(Fibonacci sequence)的4中方法
在Python中实现斐波那契数列(Fibonacci sequence)的4中方法
2529 0
|
存储 Python
链表中删除节点
链表中删除节点
|
监控 关系型数据库 MySQL
守护进程到底是什么?如何创建?(图文并茂,你不得不看的一篇文章)
**守护进程(Daemon Process)详解**:守护进程是后台运行的无终端关联的系统进程,常在启动时启动,提供持续服务,如网络服务、日志记录和定时任务。其特点包括脱离终端、后台运行、持久服务、资源管理和错误处理。创建守护进程涉及重定向文件描述符、创建新会话、改变工作目录等步骤。`ps` 和 `top` 命令用于查看守护进程,前者提供进程快照,后者显示实时资源使用情况。
1131 0
|
网络协议 安全 Go
【Go语言专栏】Go语言中的WebSocket编程
【4月更文挑战第30天】本文介绍了在Go语言中使用WebSocket进行实时Web应用开发的方法。通过第三方包`gorilla/websocket`,开发者可建立WebSocket服务器和客户端。文中展示了如何创建服务器,升级HTTP连接,以及处理读写消息的示例代码。同时,客户端的创建和通信过程也得以阐述。文章还提及WebSocket的生命周期管理、性能与安全性考虑,以及实践中的最佳做法。通过学习,读者将能运用Go语言构建高效、实时的Web应用。
866 0
|
Linux
Linux下使用Wireshark抓包教程
在实际开发中,涉及网络传输的环节是非常多的。在这些过程中,我们经常有查看被传输的数据信息的需求,因此,抓包工具应运而生。Wireshark便是一款非常有名的抓包及分析软件,具有强大的协议解析能力。本文将介绍如何在Linux系统中安装Wireshark抓包工具,以CentOS7为例。
816 0
Linux下使用Wireshark抓包教程
|
监控 关系型数据库 数据库
RDS PostgreSQL内置连接池PgBouncer
2023年7月,阿里云RDS PostgreSQL支持内置数据库连接池PgBouncer,本篇文章从以下角度探讨PgBouncer:1. PgBouncer是什么;2. 应用场景 ;3. 性能对比;4. 如何使用;5. 总结