标签:
从FIFO中读取数据:
约定:如果一个进程为了从FIFO中读取数据而阻塞打开FIFO,那么称该进程内的读操作为设置了阻塞标志的读操作。
注:如果FIFO中有数据,则设置了阻塞标志的读操作不会因为FIFO中的字节数小于请求读的字节数而阻塞,此时,读操作会返回FIFO中现有的数据量。
向FIFO中写入数据:
约定:如果一个进程为了向FIFO中写入数据而阻塞打开FIFO,那么称该进程内的写操作为设置了阻塞标志的写操作。
对于设置了阻塞标志的写操作:
对于没有设置阻塞标志的写操作:
代码可能打错,因为无输出。。:)
等以后有实际用途再说吧,
现在关键是理解一下思想。
清除阻塞和非阻塞读写的原子性之类的东东。
所以,没有一种模式是绝对标准,一定要整合业务场景需求。
/***************** * * test.c* * ******************/ #include <unistd.h> #include <sys/types.h> #include <fcntl.h> #include <errno.h> #include <string.h> #include <stdio.h> #include <stdlib.h> #define FIFO_SERVER "/tmp/fifoserver" main(int argc, char** argv) { int fd; char w_buf[4096*2]; int real_wnum; memset(w_buf, 0, 4096*2); if((mkfifo(FIFO_SERVER, O_CREAT|O_EXCL)<0)&&(errno != EEXIST)) { printf("cannot create fifoserver"); } if(fd == -1) { if(errno == ENXIO) { printf("openerror; no reading process"); } } fd = open(FIFO_SERVER, O_WRONLY|O_NONBLOCK, 0); // fd = open(FIFO_SERVER, O_WRONLY, 0); real_wnum = write(fd, w_buf, 2048); if(real_wnum == -1) { if(errno == EAGAIN) { printf("write to fifo error; try late"); } } else { printf("real write num is %d\n", real_wnum); } real_wnum = write(fd, w_buf, 5000); // real_wnum = write(fd, w_buf, 4096); if(real_wnum == -1) { if(errno == EAGAIN) { printf("try later\n"); } } }
标签:
原文地址:http://www.cnblogs.com/aguncn/p/4984990.html