"); //-->
传统的UNIX I/O函数。因为每个read, write都因调用系统调用而进入内核,所以称这些函数为不带缓存的I/O函数。
关于IO的write():
UNIX系统中,通常的write只是将数据排入队列,而实际的I/O操作则可能在以后的某个时刻运行。
数据库系统有时可能需要使用O_SYNC,这样的话,在系统崩溃的情况下,只要write返回,数据就确实写到了磁盘上。但是这样会增加时钟时间。
关于lseek()函数的操作:
在测试lseek()的返回值时应当谨慎,不要测试它是否小于0,而要测试它是否等于-1。
关于read()函数的操作:
函数原型:
ssize_t read(int filedes, void buff, size_t nbytes)
如果read成功,返回读到的字节数。如果到达文件的尾端,则返回0.
有多种情况导致读到的字节数小于要求度读取的字节数:
1. 读取普通文件尾部字符数目不足。
2. 从终端设备读时,通常一次最多读一行。
3. 当从网络读时,网络中的缓冲机构可能造成返回值小于所要求读的字节数。
此时需要加入处理机制。
4. 某些面向记录的设备,例如磁带,一次最多返回一个记录。
fcntl()函数:
//-----------------------------------------------------------------
//函数原型
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
int fcntl(int fd, int cmd);
int fcntl(int fd, int cmd, long arg);
int fcntl(int fd, int cmd, struct flock * lock);
//-----------------------------------------------------------------
fcntl()用来操作文件描述词的一些特性。
参数fd代表欲设置的文件描述词, 参数cmd代表欲操作的指令。
fcntl函数有五种功能:
? 复制一个现存的描述符(cmd = F_DUPFD)。
? 获得/设置文件描述符标记(cmd = F_GETFD 或 F_SETFD)。
? 获得/设置文件状态标志(cmd = F_GETFL 或 F_SETFL)。
? 获得/设置异步I / O有权(cmd = F_GETOWN 或 F_SETOWN)。
? 获得/设置记录锁(cmd = F_GETLK, F_SETLK 或 F_SETLKW)。
// 函数详细说明:
cmd有以下几种情况:
F_DUPFD用来查找大于或等于参数arg的最小且仍未使用的文件描述词,并且复制参数fd的文件描述词。执行成功则返回新复制的文件描述词。请参考 dup2()。
F_GETFD取得close-on-exec标志。若此标志的FD_CLOEXEC位为0,代表在调用exec()相关函数时文件将不会关闭。
F_SETFD 设置close-on-exec 标志。该标志以参数arg 的FD_CLOEXEC位决定。
F_GETFL 取得文件描述词状态标志,此标志为open()的参数flags。
F_SETFL 设置文件描述词状态标志,参数arg为新的标志,但只允许O_APPEND、O_NONBLOCK和O_ASYNC位的改变,其他位的改变将不受影响。
F_GETLK 取得文件锁定的状态。
F_SETLK 设置文件锁定的状态。此时flcok 结构的l_type 值必须是F_RDLCK、F_WRLCK或F_UNLCK。如果无法建立锁定,则返回-1,错误代码为EACCES 或EAGAIN。
F_SETLKW 与F_SETLK作用相同,但是无法建立锁定时,此调用会一直等到锁定动作成功为止。若在等待锁定的过程中被信号中断时,会立即返回-1,错误代码为EINTR。参数lock指针为flock 结构指针,定义如下
struct flcok
{
short int l_type; /* 锁定的状态*/
short int l_whence; /* 决定l_start位置*/
off_t l_start; /* 锁定区域的开头位置*/
off_t l_len; /* 锁定区域的大小*/
pid_t l_pid; /* 锁定动作的进程*/
};
l_type 有三种状态:
F_RDLCK 建立一个供读取用的锁定
F_WRLCK 建立一个供写入用的锁定
F_UNLCK 删除之前建立的锁定
l_whence 也有三种方式:
SEEK_SET 以文件开头为锁定的起始位置。
SEEK_CUR 以目前文件读写位置为锁定的起始位置。
SEEK_END 以文件结尾为锁定的起始位置。
// 返回值
成功则返回0,若有错误则返回-1,错误原因存于err
ioctl()函数:
//-----------------------------------------------------------------
//函数原型
#include <unistd.h> /* SVR4 */
#include <sys/ioctl.h> /* 4.3+BSD */
int ioctl(int filedes, int request, ...) ;
//-----------------------------------------------------------------
ioctl 函数是I/O操作的杂物箱。不能其他IO函数表示的I/O操作通常都能用ioctl表示。
// 增加两个函数:
dup()复制文件描述符函数
//-----------------------------------------------------------------
// 函数原型
#include<unistd.h>
int dup (int oldfd);
//-----------------------------------------------------------------
// 函数说明:
dup()用来复制参数oldfd所指的文件描述词,并将它返回。
此新的文件描述词和参数oldfd指的是同一个文件,共享所有的锁定、读写位置和各项权限或标志。
例如,当利用lseek()对某个文件描述词作用时,另一个文件描述词的读写位置也会随着改变。不过,文件描述符之间并不共享close-on -exec标志。
// 返回值
当复制成功时,则返回最小及尚未使用的文件描述符。若有错误则返回-1,errno会存放错误代码。错误代码EBADF表示参数fd 非有效的文件描述词,或该文件已关闭。
dup2() 复制文件描述符函数
//-----------------------------------------------------------------
// 函数原型
#include<unistd.h>
int dup2(int odlfd,int newfd);
//-----------------------------------------------------------------
// 函数说明
dup2()用来复制参数oldfd所指的文件描述词,并将它拷贝至参数newfd后一块返回。若参数newfd为一已打开的文件描述词,则newfd所指的文件会先被关闭。dup2()所复制的文件描述词,与原来的文件描述词共享各种文件状态,详情可参考dup()。
// 返回值
当复制成功时,则返回最小及尚未使用的文件描述词。若有错误则返回-1,errno会存放错误代码。
// 附加说明
dup2()相当于调用fcntl(oldfd,F_DUPFD,newfd);请参考fcntl()。
// 错误代码
EBADF 参数fd 非有效的文件描述词,或该文件已关闭
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。