open函数用来打开一个设备,他返回的是一个整型变量,如果这个值等于-1,说明打开文件出现错误,如果为大于0的值
参考格式 if(fd=open("/dev/ttys0",O_RDWR | O_NOCTTY | O_NDELAY))<0 {printf("cannot open"};
int open(const char *pathname, int oflag, …/*, mode_t mode * / ) ;
打开的操作类型有如下几种
- O_RDONLY 只读打开
- O_WRONLY 只写打开
- O_RDWR 读、写打开
- O_APPEND 每次写时都加到文件的尾端
- O_CREAT 若此文件不存在则创建它。使用此选择项时,需同时说明第三个参数mode,用其说明该新文件的存取许可权位。
- O_EXCL 如果同时指定了O_CREAT,而文件已经存在,则出错。这可测试一个文件是否存在,如果不存在则创建此文件成为一个原子操作。
- O_TRUNC 如果此文件存在,而且为只读或只写成功打开,则将其长度截断为0。
- O_NOCTTY 如果pathname指的是终端设备,则不将此设备分配作为此进程的控制终端。
- O_NONBLOCK 如果pathname指的是一个FIFO、一个块特殊文件或一个字符特殊文件,则此选择项为此文件的本次打开操作和后续的I/O操作设置非阻塞方式。
10)O_SYNC 使每次write都等到物理I/O操作完成。
这些控制字都是通过“或”符号分开(|)
O_NONBLOCK和O_NDELAY所产生的结果都是使I/O变成非阻塞模式(non-blocking),在读取不到数据或是写入缓冲区已满会马上return,而不会阻塞等待。
它们的差别在于:在读操作时,如果读不到数据,O_NDELAY会使I/O函数马上返回0,但这又衍生出一个问题,因为读取到文件末尾(EOF)时返回的也是0,这样无法区分是哪种情况。因此,O_NONBLOCK就产生出来,它在读取不到数据时会回传-1,并且设置errno为EAGAIN。
O_NDELAY是在System V的早期版本中引入的,在编码时,还是推荐POSIX规定的O_NONBLOCK,O_NONBLOCK可以在open和fcntl时设置。
浙公网安备 33010602011771号