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

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

开发者学堂课程【物联网开发- 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也会阻塞。

 

 

相关文章
|
存储 消息中间件 设计模式
进程通信常见方式
进程通信常见方式
进程通信常见方式
套接字非阻塞设置
套接字非阻塞设置
|
6月前
|
Shell
【进程通信】利用管道创建进程池(结合代码)
【进程通信】利用管道创建进程池(结合代码)
|
6月前
|
Linux
【Linux】命名管道的创建方法&&基于命名管道的两个进程通信的实现
【Linux】命名管道的创建方法&&基于命名管道的两个进程通信的实现
|
4月前
|
数据采集 大数据 数据安全/隐私保护
Python编程:如何有效等待套接字的读取与关闭
Python网络编程中,套接字事件处理至关重要。利用`selectors`模块和代理IP能增强程序的稳定性和可靠性。代码示例展示了如何通过代理连接目标服务器,注册套接字的读写事件并高效处理。在代理IP配置、连接创建、事件循环及回调函数中,实现了数据收发与连接管理,有效应对网络爬虫或聊天应用的需求,同时保护了真实IP。
Python编程:如何有效等待套接字的读取与关闭
|
6月前
|
负载均衡 Java Linux
管道,信号量,共享内存,socket的实际使用场景和NSPipe管道的使用
管道,信号量,共享内存,socket的实际使用场景和NSPipe管道的使用
88 0
|
网络协议 小程序 Java
网络编程之 Socket 套接字(使用数据报套接字和流套接字分别实现一个小程序(附源码))
1. 什么是网络编程 2. 网络编程中的基本概念 1)发送端和接收端 2)请求和响应 3)客户端和服务端 4)常见的客户端服务端模型 3. Socket 套接字 1)Socket 的分类 2)Java 数据报套接字通信模型 3)Java 流套接字通信模型 4. UDP 数据报套接字编程 1)DatagramSocket API 2)DatagramPacket API 3)示例 5. TCP 流套接字编程 1)ServerSocket API 2)Socket API 3)示例 a. 短连接版本 b. 长连接并发版本
275 0
|
Linux Windows
Linux系统应用编程---进程间通信(一)【管道pipe fifo】
Linux系统应用编程---进程间通信(一)【管道pipe fifo】
161 0
|
物联网 Linux 开发者
命名管道创建及读写|学习笔记
快速学习命名管道创建及读写