非阻塞方式打开命名管道|学习笔记

简介: 快速学习非阻塞方式打开命名管道

开发者学堂课程【物联网开发- Linux 高级程序设计全套视频非阻塞方式打开命名管道】学习笔记,与课程紧密联系,让用户快速学习知识。

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


非阻塞方式打开命名管道

 

指定 O _NONBLOCK(即 open 位或 O_ NONBLOCK)

 

1、先以只读方式打开:

如果没有进程已经为写而打开一个 FIFO,只读 open 成功,并且 open 不阻塞。

例如:读的

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

{

int  fd;

int  ret;

ret  =  mkfifo ("my_ fifo",S_ IRUSR|SI_WUSR);

if(ret!=0)

{

perror("mkfifo");

}

fd=open("my _fife",O _RDONLY|O_ NONBLOCK);

if(fd<0)

{

perror("open fifo");

}

while(1)

{

char recv[100];

Bzero(recv,sizeof(recv));

Read(fd,recv,sizeof(recv));

Printf(“read from my_fifo buf = [%s]\n“,recv);

Sleep(1);

}

Return 0;

写的:

#include<sys/stat.h>

#include<fcnt 1.h>

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

int fd;

char send[100]="Hello I love you";

fd=open("my_ fifo",O_WRONLY]O _NONBLOCK);

if(fd<0)

{

perror("open fifo");

}

write(fd, send, strlen(send));

printf("write to my fifo buff=%s\n", send);

While(1);

return 0;

}

格式转为UFT-8无 BOM 编码格式

image.gif

能打开而且不堵塞,open 不堵塞,read 也不堵塞

2、先以只写方式打开:如果没有进程已经为读而打开一个FIFO,只写open将出错返回−1。

下面是出错示例:

image.gif

open出错 应该return0

#include。<sys/stat.h>

#include<fentl.h>

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

{

int fd;

char send[100]="Hello I love you";

fd=open

("my fifo",O WRONLY]O NONBLOCK);

if(fd<0)

{

perror("open fifo");

return 0;

}

write(fd, send, strlen(send));

printf("write to my fifo buff=%s\n", send);

while(l);

return 0;

}

image.gif

image.gif

先以只读方式打开可以,不能先以只写方式打开

3、read、write读写命名管道中读数据时不阻塞。

4、通信过程中,读进程退出后,写进程向命名管道内写数据时,写进程也会(收到SIGPIPE信号)退出。

例:

04 fifo-read 5.c 非阻塞方式打开命名管道,验证 open 和 read 都不阻塞

#include<studio.h>

#include<string.h>

#include<unistd.h>

#include<sys/types.h>

#include<sys/stat.h>

#include<fentl.h>

#include。<sys/stat.h>

#include<fentl.h>

#include。<sys/stat.h>

#include<fentl.h>

注意:open 函数以可读可写方式打开 FIFO 文件时的特点:

1、open 不阻塞。

2、调用 read 函数从 FIFO 里读数据时 read 会阻塞。

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

 

 

相关文章
|
JavaScript Java 关系型数据库
基于 SpringBoot+vue的地方美食系统(Java 毕业设计)上
基于 SpringBoot+vue的地方美食系统(Java 毕业设计)
|
运维 Linux 网络安全
推荐几款SSH客户端
对于经常使用Linux服务器的,应该都对SSH比较熟悉吧!特别是做运维的,而对于做Linux或Android系统开发的,一般会在公司搭建一台性能强劲的服务器,然后大家一起在上面做开发。大家一般都是通过SSH客户端登录到服务器上进行开发。那接下来给大家推荐几款平时常用的SSH客户端。
|
网络协议 ice
STUN, TURN, ICE介绍
STUN STUN协议为终端提供一种方式能够获知自己经过NAT映射后的地址,从而替代位于应用层中的私网地址,达到NAT穿透的目的。STUN协议是典型的Client-Server协议,各种具体应用通过嵌入STUN客户端与STUN Server端通讯来完成交互。
14685 1
|
监控 Shell Go
如何自己写一个telegraf的插件
之前有个特殊需求要自己搞一个telegraf的插件,就顺手写了这个小指南,go初学者级别吧
1656 0
|
10月前
|
编译器 C++ 开发者
【C++篇】深度解析类与对象(下)
在上一篇博客中,我们学习了C++的基础类与对象概念,包括类的定义、对象的使用和构造函数的作用。在这一篇,我们将深入探讨C++类的一些重要特性,如构造函数的高级用法、类型转换、static成员、友元、内部类、匿名对象,以及对象拷贝优化等。这些内容可以帮助你更好地理解和应用面向对象编程的核心理念,提升代码的健壮性、灵活性和可维护性。
|
8月前
|
存储 人工智能 弹性计算
阿里云服务器五代至八代实例对比:性能对比与精准选型指南参考
目前,阿里云服务器最新的实例规格已经升级到第九代,不过主售的云服务器实例规格还是以七代和八代云服务器为主。对于初次接触阿里云服务器实例规格的用户来说,可能并不清楚阿里云服务器五代、六代、七代、八代实例有哪些,以及它们之间有何区别。本文将详细介绍阿里云五代、六代、七代、八代云服务器实例规格,并对比它们在性能方面的提升,以供参考和选择。
|
11月前
|
JSON 监控 API
京东商品列表 API 接口系列(京东 API)
京东商品列表API接口为开发者提供获取店铺内商品详细信息的功能,包括名称、价格、库存、图片、ID、销量等。通过HTTP GET请求并包含必要参数(如店铺ID、API密钥),可获取JSON格式的商品列表数据,适用于展示、库存管理、价格监控等场景。示例代码展示了使用Python调用该接口的方法,返回的数据包含状态码、商品总数、分页信息及具体商品详情。
|
负载均衡 算法 Linux
在Linux中,如何配置负载均衡器以分配网络流量?
在Linux中,如何配置负载均衡器以分配网络流量?
|
安全 程序员 编译器
【C语言】const 关键字详解
`const`关键字在C语言中用于定义常量,提供只读的变量。这意味着一旦初始化,`const`变量的值不能再被修改。下面详细介绍`const`关键字的用法、作用以及其在不同上下文中的应用。
715 2
|
监控 搜索推荐 语音技术
测试使用SenseVoice大模型测评
测试使用SenseVoice大模型测评
382 4