您的位置:首页 > 编程语言

文件I/O - UNIX环境高级编程-第3章

2014-09-26 15:06 176 查看
>>-----基本的系统数据类型<<



>>------------------------第3章 文件IO--------------------------------<<

open函数:

int open(const char *pathname, int oflag, ... )//返回值:成功返回文件描述符,出错-1

creat函数:

int creat(const char *pathname, mode_t mode); //返回值:成功只写打开的文件描述符,出错-1

close函数:

int close(int filedes); //返回值:成功0,失败-1

当一个进程终止时,内核自动关闭它所有打开的文件。

lseek函数:

off_t lseek(int filedes, off_t offset, int whence);//返回值:成功为新文件偏移量,出错-1

偏移量可能是负值,比较它的返回值时,不要测试是否小于0,要测试是否等于-1

read函数:

ssize_t read(int filedes, void *buf, size_t nbytes);//返回值:成功返回读到的字节数,已到文件尾返回0,出错返回-1

1.读普通文件时,在读到要求字节之前就读到文件尾,例如在到达文件尾前还有30个字节,而要求读100个字节,则read返回30,下次再调用read,它返回0

write函数:

ssize_t write(itn filedes, const void *buf, size_t nbytes);//返回值:成功返回已写字节数,出错-1

>>--------------------------------------------------IO的效率----------------------------------------------------------

用不同缓冲区长度进行读操作时,系统CPU时间最小值出现在BUFSIZE为4096处,继续增加对此时间几乎没有影响

>>------------------文件共享--------------------

每个打开文件(或设备)都有一个V节点(V-node)结构,V节点包含了文件类型和对文件进行操作的函数的各种指针,对大多数文件来说,它还包含该文件的i节

点(i-node索引节点)。i节点包含文件所有者,文件长度,文件所属设备,指向文件实际物理磁盘地址上的指针等



每一个进程都有自己的文件表项,其中也有他自己当前文件偏移量。

>>------------------原子操作--------------------

任何一个需要多个函数调用的操作都不可能是原子操作,因为在两个函数调用之间,内核有可能会挂起该进程。

>>----------sync、fsync、fdatasync--------------

int fsync(int filedes);

int fdatasunc(int filedes);

sync函数只是将所有修改过的块缓冲区排序写队列,然后返回,他并不等待实际写磁盘结束

fsync函数只对文件描述符filedes指定的单一文件起作用,并且等待写磁盘结束返回

>>----------fcntl函数--------------

fcntl函数可以改变已打开文件的性质

int fcntl(int diledes, int cmd, ...);
返回值:成功依赖于cmd,失败-1

在unix系统中,通常write函数只是将数据排入队列,而实际上写磁盘操作可能在以后的某个时间进行,数据库系统可能要用到O_SYNC,这样当它从write返回值就知道数据已经写到磁盘了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: