当open一个FIFO时,是否设置非阻塞标志(O_NONBLOCK)的区别:
①若没有指定O_NONBLOCK(默认),只读open要阻塞到某个其他进程为写而打开此FIFO。类似的,只写open要阻塞到某个其他进程为读而打开它。
②若指定了O_NONBLOCK,则只读open立即返回,而只写open将出错返回-1如果没有进程已经为读而打开该FIFO,其errno置ENXIO。
例:
读的方式打开
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <errno.h>
#include <fcntl.c>
// int mkfifo(const char *pathname, mode_t mode);
int main()
{
if((mkfifo("./file",0600)==-1)&&errno!=EEXIST){
printf("mkfifo failuer \n");
perror("why?\n");
}
int fd = open("./file",O_RDONLY);
printf("open success\n");
//用写的方式打开FIFO,读才不会阻塞
return 0;
}
读的方式打开
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <errno.h>
#include <fcntl.c>
// int mkfifo(const char *pathname, mode_t mode);
int main()
{
int fd = open("./file",O_WRONLY);
printf("write open success\n");
//用写的方式打开FIFO,读才不会阻塞
return 0;
}
运行read会发生阻塞,调用write之后程序继续进行。
例:读取FIFO内容
//读的方式打开
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <errno.h>
#include <fcntl.c>
// int mkfifo(const char *pathname, mode_t mode);
int main()
{
int buf[30] = {0};
if((mkfifo("./file",0600) == -1) && errno != EEXIST){
printf("mkfifo failuer \n");
perror("why?\n");
}
int fd = open("./file",O_RDONLY);
printf("open success\n");
//用写的方式打开FIFO,读才不会阻塞
int nread = read(fd,buf,20);
printf("read %d byte from fifo , context : %s\n",nread,buf);
close(fd);
return 0;
}
//写的方式打开
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <errno.h>
#include <fcntl.c>
// int mkfifo(const char *pathname, mode_t mode);
int main()
{
char *str = "message from FIFO !";
int fd = open("./file",O_WRONLY);
printf("write open success\n");
//用写的方式打开FIFO,读才不会阻塞
write(fd,str,strlen(str));
close(fd);
return 0;
}