linux一切皆文件
文件操作的几种系统调用函数:open、read、write、close、lseek
文件描述符:fd
对于一个进程来讲,默认最大文件描述符为1024,其中0分配给了标准输入,如键盘输入;1分配给了标准输出,如显示器;2分配给了标准出错,如显示器。
打开文件:open
函数原型:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
函数参数和返回值定义如下:
pathname: 字符串类型,用于标识需要打开或者新建的文件,可以包含路径(相对路径或者绝对路径)信息,如果pathname是一个符号链接,会对其进行解引用。
flags: 调用open函数时需要提供的标志,包括文件访问模式标志以及其它相关标志,常见的有O_RDONLY(只读)、O_WRONLY(只写)、O_RDWR(读写)、O_CREAT(文件不存在则创建此文件)、O_DIRECTORY(如果pathname参数指向的不是一个目录则调用open失败)、O_EXCL(此标志一般与O_CREAT一起使用,用于专门创建文件,如果文件存在则返回错误)、O_NOFOLLOW(如果pathname指向的是符号链接,将不对其进行解引用,直接返回错误)、O_TRUNC(将文件原本的内容全部丢弃,文件大小变为 0)、O_APPEND(调用 open 函数打开文件,当每次使用 write()函数对文件进行写操作时,都会自动把文件当前位置偏移量移动到文件末尾,从文件末尾开始写入数据,也就是意味着每次写入数据都是从文件末尾开始 )。
mode:此参数用于指定新建文件的访问权限,只有当flags参数中包括O_CREAT或O_TMPFILE(用于创建临时文件)标志时才有效。mode_t是一个u32数据,从高位到地位依次用U、G、O表示,U表示文件的所属者(user)、G表示同组用户(group)的权限、O表示其它用户(other)的权限。
返回值:成功将返回文件描述值,文件描述值是一个非负整数;失败将返回-1。
示例:
(1)
使用
open
函数打开一个已经存在的文件(例如当前目录下的
app.c
文件),使用只读方式打开:
int fd = open("./app.c", O_RDONLY);
if(fd == -1)
{
printf("open file error\n");
return fd;
}
(2)
使用
open
函数打开一个指定的文件(譬如
/home/litao/hello
),使用可读可写方式
,
如果该文件是 一个符号链接文件,则不对其进行解引用,直接返回错误:
int fd = open("/home/litao/hello", O_RDWR | O_NOFOLLOW);
if(fd == -1)
{
printf("open file error, becaese it is a symbolic link file");
return fd;
}
(3)
使用
open
函数打开一个指定的文件(譬如
/home/litao/hello
),如果该文件不存在则创建该文件, 创建该文件时,将文件权限设置如下:
文件所属者拥有读、写、执行权限; 同组用户与其他用户只有读权限。 使用可读可写方式打开:
int fd = open("/home/litao/hello", O_RDWR | O_CREAT, S_IRWXU | S_IRGRP | S_IROTH);
if(fd == -1)
{
printf("open file error, failed to create file");
return fd;
}
写文件:write
函数原型:
#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count);
函数参数和返回值含义如下:
fd : 文件描述符,将进行写操作的文件所对应的文件描述符传递给write函数。
buf:指定写入数据对应的缓冲区。
count:指定写入的字节数。
返回值:如果成功将返回写入的字节数,如果此数字小于count参数,可能磁盘空间已满;如果写入出错,则返回-1。
对于普通文件,读写操作都是从文件的当前位置偏移量处开始。
读文件:read
函数原型:
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
函数参数和返回值含义如下:
fd : 文件描述符,将进行读操作的文件所对应的文件描述符传递给read函数。
buf:指定用于存储读取数据的缓冲区。
count:指定需要读取的字节数。
返回值:如果成功将返回读取到的字节数,如果此数字小于count参数,可能
当前文件位置偏移量已经到了文件末尾;如果写取出错,则返回-1。
文件关闭:close
函数原型:
#include <unistd.h>
int close(int fd);
函数参数和返回值含义如下:
fd : 文件描述符,需要关闭的文件对应的文件描述符。
返回值:如果成功返回0,失败则返回-1。
文件偏移:lseek
函数原型:
#include <sys/types.h>
#include <unistd.h>
off_t lseek(int fd, off_t offset, int whence);
函数参数和返回值含义如下:
fd : 文件描述符。
offset:偏移量,以字节为单位。
whence:用于定义参数offset偏移量对应的参考值,SEEK_SET表示
读写偏移量将指向
offset 字节位置处(从文件头部开始算),SEEK_CUR表示读写偏移量将指向当前位置偏移量
+ offset 字节位置处(offset为正数时向后偏移,为负数时向前偏移),SEEK_END表示读写偏移量将指向文件末尾
+ offset 字节位置处(offset为正数时向后偏移,为负数时向前偏移)。
返回值:如果成功返回当前的读写位置,失败则返回-1。
使用示例:
(1)
将读写位置移动到文件开头处:
off_t off = lseek(fd, 0, SEEK_SET);
if (off == -1)
return -1;
(2)
将读写位置移动到文件末尾:
off_t off = lseek(fd, 0, SEEK_END);
if (off == -1)
return -1;
(3)
将读写位置移动到偏移文件开头
100
个字节处:
off_t off = lseek(fd, 100, SEEK_SET);
if (off == -1)
return -1;
(4)
获取当前读写位置偏移量:
off_t off = lseek(fd, 0, SEEK_CUR);
if (off == -1)
return -1;