开发者学堂课程【物联网开发- 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 编码格式
能打开而且不堵塞,open 不堵塞,read 也不堵塞
2、先以只写方式打开:如果没有进程已经为读而打开一个FIFO,只写open将出错返回−1。
下面是出错示例:
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;
}
先以只读方式打开可以,不能先以只写方式打开
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也会阻塞。