您的位置:首页 > 运维架构 > Linux

linux c学习笔记08--文件操作

2015-07-17 14:25 531 查看
1 . 创建
int creat(const char *filename, mode_t mode);
参数 mode 指定新建文件的存取权限,它同 umask 一起决定文件的最终权限( mode&umask),
其中 umask 代表了文件在创建时需要去掉的一些存取权限。 umask 可通过系统调用 umask()来改变:
int umask(int newmask);
该调用将 umask 设置为 newmask,然后返回旧的 umask,它只影响读、写和执行权限。
2. 打开
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
open()函数有两个形式,其中 pathname 是我们要打开的文件名 ( 包含路径名称,缺省是认为
在当前路径下面), flags 可以是如下 所示的一个值或者是几个值的组合。

文件打开标志

标 志 含 义

O_RDONLY

以只写的方式打开文件

O_WRONLY

以只读的方式打开文件

O_RDWR

以读写的方式打开文件

O_APPEND

以追加的方式打开文件

O_EXEC

如果使用了 O_CREAT 而且文件已经存在,就会发生一个错误

O_CREAT

创建一个文件

O_NOBLOCK

以非阻塞的方式打开一个文件

O_TRUNC

如果文件已经存在,则删除文件的内容

O_RDONLY、 O_WRONLY、 O_RDWR 三个标志只能使用任意的一个。
如果使用了 O_CREATE 标志,则使用的函数是 int open(const char *pathname,int flags,mode_tmode); 这个时候我们还要指定 mode 标志,用来表示文件的访问权限。

Linux用 5 个数字来表示文件的各种权限:第一位表示设置用户 ID;第二位表示设置组 ID;第三位表示用户自己的权限位;第四位表示组的权限;最后一位表示其他人的权限。每个数字可以取 1(执
行权限)、 2(写权限)、 4(读权限)、 0(无)或者是这些值的和。例如,要创建一个用户可读、可写、可执行,但是组没有权限,其他人可以读、可以执行的文件,并设置用户 ID 位。那么,
我们应该使用的模式是 1 (设置用户 ID)、 0(不设置组 ID)、 7( 1+2+4,读、写、执行)、 0(没有权限)、 5( 1+4,读、执行)

即 10 705:open("test", O_CREAT, 10 705);
上述语句等价于:
open("test", O_CREAT, S_IRWXU | S_IROTH | S_IXOTH | S_ISUID );
如果文件打开成功, open 函数会返回一个文件描述符,以后对该文件的所有操作就可以通过
对这个文件描述符进行操作来实现。
3. 读写
在文件打开以后,我们才可对文件进行读写, Linux 中提供文件读写的系统调用是 read、 write
函数:
int read(int fd, const void *buf, size_t length);
int write(int fd, const void *buf, size_t length);
其中 参数 buf 为指向缓冲区的指针, length 为缓冲区的大小(以字节为单位)。函数 read()实
现从文件描述符 fd 所指定的文件中读取 length 个字节到 buf 所指向的缓冲区中,返回值为实际读
取的字节数。函数 write 实现将把 length 个字节从 buf 指向的缓冲区中写到文件描述符 fd 所指向
的文件中,返回值为实际写入的字节数。
以 O_CREAT 为标志的 open 实际上实现了文件创建的功能,因此,下面的函数等同 creat()函数:
int open(pathname, O_CREAT | O_WRONLY | O_TRUNC, mode);
4. 定位
lseek()将文件读写指针相对 whence 移动 offset 个字节。操作成功时,返回文件指针相对于文
件头的位置。参数 whence 可使用下述值:
SEEK_SET:相对文件开头
SEEK_CUR:相对文件读写指针的当前位置
SEEK_END:相对文件末尾
offset 可取负值,例如下述调用可将文件指针相对当前位置向前移动 5 个字节:
lseek(fd, -5, SEEK_CUR);
由于 lseek 函数的返回值为文件指针相对于文件头的位置,因此下列调用的返回值就是文件
的长度:
lseek(fd, 0, SEEK_END);
5. 关闭
当我们操作完成以后,我们要关闭文件了,只要调用 close 就可以了,其中 fd 是我们要关闭
的文件描述符:
int close(int fd);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: