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

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

开发者学堂课程【物联网开发- 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 毕业设计)
|
数据可视化 API vr&ar
探索Qt 3D之旅:从基础到实战,打造引人入胜的三维界面与应用
探索Qt 3D之旅:从基础到实战,打造引人入胜的三维界面与应用
3113 3
|
存储 编解码 应用服务中间件
使用Nginx搭建流媒体服务器
本文介绍了流媒体服务器的特性及各种流媒体传输协议的适用场景,并详细阐述了使用 nginx-http-flv-module 扩展Nginx作为流媒体服务器的详细步骤,并提供了在VLC,flv.js,hls.js下的流媒体拉流播放示例。
2301 4
|
JavaScript Java 数据库
生鲜超市|基于SprinBoot+vue的生鲜超市系统(源码+数据库+文档)
生鲜超市|基于SprinBoot+vue的生鲜超市系统(源码+数据库+文档)
299 0
|
存储 缓存 网络协议
网络编程初学者必备:从零开始的详细教程与资源汇总
网络编程初学者必备:从零开始的详细教程与资源汇总
588 0
|
安全 程序员 编译器
【C语言】const 关键字详解
`const`关键字在C语言中用于定义常量,提供只读的变量。这意味着一旦初始化,`const`变量的值不能再被修改。下面详细介绍`const`关键字的用法、作用以及其在不同上下文中的应用。
968 2
|
存储 缓存 C语言
【C/C++ 库的动态链接】深入理解动态链接器:RPATH, RUNPATH与$ORIGIN
【C/C++ 库的动态链接】深入理解动态链接器:RPATH, RUNPATH与$ORIGIN
1314 0
|
传感器 存储 编解码
基于STM32的智能手环设计与实现(上)
基于STM32的智能手环设计与实现(上)
1475 1
|
运维 监控 Linux
在Linux中,如何查看所有正在运行的进程?
在Linux中,如何查看所有正在运行的进程?
|
API
STM32速成笔记(九)—RTC
本文详细介绍了RTC模块,介绍了STM32的RTC的特性,框图,配置步骤,并给出了详细的程序设计。最后,针对实际使用时可能遇到的问题给出了解决方法以及程序。
1060 0
STM32速成笔记(九)—RTC