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

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

开发者学堂课程【物联网开发- 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管道的使用
81 0
|
Linux Windows
Linux系统应用编程---进程间通信(一)【管道pipe fifo】
Linux系统应用编程---进程间通信(一)【管道pipe fifo】
157 0
|
物联网 Linux 开发者
无名管道的创建|学习笔记
快速学习无名管道的创建
无名管道的创建|学习笔记
|
物联网 Linux 开发者
命名管道创建及读写|学习笔记
快速学习命名管道创建及读写
|
Linux C++
linux下串口的阻塞和非阻塞操作
有两个可以进行控制串口阻塞性(同时控制read和write):一个是在打开串口的时候,open函数是否带O_NDELAY;第二个是可以在打开串口之后通过fcntl()函数进行控制。 阻塞的定义:        对于read,block指当串口输入缓冲区没有数据的时候,read函数将会阻塞在这里,移植到串口输入缓冲区中有数据可读取,read读到了需要的字节数之后,返回值为读到的字节数; 对于write,block指当串口输出缓冲区满,或剩下的空间小于将要写入的字节数,则write将阻塞,一直到串口输出缓冲区中剩下的空间大于等于将要写入的字节数,执行写入操作,返回写入的字节数。
1644 0