linux应用编程--文件I/O基础

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;

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值