O_NONBLOCK 如果pathname指的是一个FIFO、一个块特殊文件或一个字符特殊文件,则此选择项为此文件的本次打开操作和后续的I/O操作设置非阻塞方式。(只用于设备文件,而不用于普通文件。)
(1)阻塞与非阻塞。如果一个函数是阻塞式的,则我们调用这个函数时当前进程有可能被卡住(阻塞住,实质是这个函数内部要完成的事情条件不具备,当前没法做,要等待条件成熟),函数被阻塞住了就不能立刻返回;如果一个函数是非阻塞式的那么我们调用这个函数后一定会立即返回,但是函数有没有完成任务不一定。
(2)阻塞和非阻塞是两种不同的设计思路,并没有好坏。总的来说,阻塞式的结果有保障但是时间没保障;非阻塞式的时间有保障但是结果没保障。
(3)操作系统提供的API和由API封装而成的库函数,有很多本身就是被设计为阻塞式或者非阻塞式的,所以我们应用程度调用这些函数的时候心里得非常清楚。
(4)我们打开一个文件默认就是阻塞式的,如果你希望以非阻塞的方式打开文件,则flag中要加O_NONBLOCK标志。
O_SYNC 使每次write都等到物理I/O操作完成
(1)write阻塞等待底层完成写入才返回到应用层。
(2)无O_SYNC时write只是将内容写入底层缓冲区即可返回,然后底层(操作系统中负责实现open、write这些操作的那些代码,也包含OS中读写硬盘等底层硬件的代码)在合适的时候会将buf中的内容一次性的同步到硬盘中。这种设计是为了提升硬件操作的性能和销量,提升硬件寿命;但是有时候我们希望硬件不好等待,直接将我们的内容写入硬盘中,这时候就可以用O_SYNC标志。
2、creat函数(也可用creat函数创建一个新文件)
需要用到的头文件 #include<sys/types.h> #include<sys/stat.h> #include<fcutl.h> 函数原型: int creat(const char *pathname, mode_t mode); 返回:若成功为只写打开的文件描述符,若出错为-1此函数等效于 open(pathname,O_WRONLY|O_CRAT|O_TRUNC,mode);
3、read 函数(用read函数从打开的文件中读取数据)
需要的头文件: #include<unistd.h> 函数原型: ssize_t read(int filedes,void *buffer,size_t nbytes); 返回值:读取到字节数,若已到文件尾0,则返回-1如果read成功,则返回读取到字节数。如已到文件结尾返回0;有多种情况可使实际读到的字节数少于要求读字节数:
1、读取普通文件时,在读到要求字节数之前已经到达了文件结尾。例如,若在到达文件尾端之前还有30个字节,而要求读100个字节,则read返回30,下一次调用read时,它将返回0(文件尾端)。
2、当从终端设备读时,通常一次最多读一行
3、当从网络读时,网络中缓存机构可能造成返回值小于所要求读的字节数。
4、某些面向记录的设备,例如磁带,一次最多返回一个记录。
4、write函数(用write函数向打开的文件写数据)
需要用到的头文件 #include<unistd.h> 函数原型: ssize_t write(int filedes,const void buffer,size_t nbytes); 返回值:若成功返回已写字节数,若出错返回-1 其返回值通常与参数nbyte的值不同,否则表示出错。write出错的一个常见原因是:磁盘已写满,或者超过了对一个给定进程的文件长度限制。写入用write系统调用,write的原型和理解方法和read相似
5、close函数(可以用close函数关闭一个打开是文件)
需要用到的头文件: #include<unistd.h> 函数原型: int close(int filedes); 返回值:成功返回0,若出错返回-1当一个进程终止时,它所有的打开的文件都是由内核自动关闭。
6、lseek函数