10. linux文件操作

来源:互联网 发布:pc端淘宝直播入口 编辑:程序博客网 时间:2024/06/06 10:47

1.  文件描述符

      每一个分配的文件描述符与打开的文件描述相联系, 而文件描述是打开的文件的信息,这些信息 包括:偏移量,访问模式及其它标志。

       每个进程可打开的最大文件描述符数是有上限的,在linux中由OPEN_MAX定义,为256. 每个进程有三个默认打开的描述符标准输入,标准输出,标准错误。

      文件描述符与文件描述可以是多对一的关系,经实验,多个进程可以同时打开一个文件,并进行操作。而文件描述中使用引用计数来记录被引用了多少次。


#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>int open(const char* path, int flags)int open(const char* path, int flags, int mode)
其中flags标志在fcntl.h中定义。

O_CREATE, O_EXCL, O_TRUNC, O_APPEND; O_RDONLY, O_WRONLY, O_RDWR

   mode用来对所创建的文件的所有者,所有者所在组及其它用户的权限进行设置。

   S_IRUSR, S_IWUSR, S_IXUSR, S_IRGRP, S_IWGRP, S_IXGRP, S_IROTH, S_IWOTH, S_IXOTH

       此外S_ISUID,  S_ISGID,用来设置s权限。

   注1: 实际的权限位为  mode &(~umask);


#include<unistd.h>int access(char* path, int mode);

   测试是否可以用一定的访问模式访问文件。 mode R_OK, W_OK, X_OK, F_OK(判断文件是否存在)。


int read(int fd, void* buf, size_t nbytes)

返回-1错误,返回0:读完。

int write(int fd, void* buf, size_t nbytes)
    OK:返回nbytes值一样,表示写入的字节数,
    错误:如果不满足OK条件,即说明发生了错误。
</pre><pre name="code" class="html"><strong>READ, WRITE总结</strong>
<strong> </strong> <span style="color:#ff6600;"> read 与write利用了内存缓冲区技术,内存缓冲区类型分为行缓冲区, 全缓冲区。</span>
   全缓冲区的大小在/usr/include/_g_config.h, 大小为8192
   内存缓冲区的存在说明write操作并不是同步到硬盘的。
   <strong>在文件访问模式中加入O_SYNC可以确保write是同步到硬盘的,<span style="color:#cc6600;">但此标志是不可移值的</span>。(如果别的系统不支持此标志,即使发生问题,也不会有什么提示)。</strong>
<pre name="code" class="html" style="font-weight: bold;">int close(fd)

0:成功 -1:失败。 写入errno. 其失败的原因只有一个 EBAF(无效的文件描述符)。一般不用判断close的返回值。

     注: 当一个进程结束时,任何打开的文件将会被自动关闭。

注: open close系列没有提供用户缓冲区。 fopen fclose系统提供了用户缓冲区。 

      内存缓冲区与用户缓冲区的作用。  内存缓冲区可以利用硬盘预读取技术,使用对硬盘的读取变成对内存的读取,加快速度。写时先写入内存缓冲区,等待写满后或刷新时写入硬盘,减少了写硬盘的次数。  为了减少读写时系统调用的次数,会一次读写(调用read或write)较大的数据量。  而较大的数据量对用户而言不便操作,隧提出用户缓冲区的概念。直白的说就是再利用小的buffer顺序处理大的buffer中的数据。直接读硬盘时read进大的buffer,待写的大buffer 满时调用write函数再写入硬盘(先到内存缓冲区)。 

int lseek(int fd, off_t offset, int base)
 base: SEEK_SET, SEEK_CUR, SEEK_END
 返回值: -1:错误, 其它:从文件头到偏移处的字节数。


终端控制函数

int ioctl(int fd, int cmd, int arg)

每一类使用ioctl的设备都有一套它传递给ioctl调用的cmd与参数集合。


0 0
原创粉丝点击