首页 > 代码库 > linux 文件编程c语言操作系统调用函数总结(一)

linux 文件编程c语言操作系统调用函数总结(一)

#include <fcntl.h>
int open(const char *path, int oflag, ... /* mode_t mode */ );
int openat(int fd, const char *path, int oflag, ... /* mode_t mode */ );

open函数调用成功返回打开文件的文件描述符,失败时返回-1oflag参数表明打开文件的状态标志,必须且只能包含以下5个标志中的一个:

O_RDONLY:只读打开

O_WRONLY:只写打开

O_RDWRONLY:读写打开

O_EXEC: 只执行打开

O_SEARCH:只搜索打开,仅用于目录

除了这些标志以外,还有一些标志为可选选项

O_APPEND: 在文件末尾写入,有此选项存在时,文件每次写入都是以文件末尾为基准添加内容,不可以修改已写入的内容

O_CREAT: 文件不存在时,创建文件

O_EXCL:与O_CREAT同时出现时,如果文件已存在,调用出错

O_FOLLOW: 如果path是一个符号链接,则调用出错

O_TRUNC:如果文件存在,则将文件长度清为0打开

O_SYNC:每次写操作要等待物理IO操作完成,包括该写操作引起的文件属性(如文件长度)更新所需的IO

O_DSYNC:每次写操作要等待物理IO操作完成,但是如果该写操作并未引起文件属性的改变,则不需要等待文件属性文件属性更新。

当文件打开模式中包含O_CREAT时,还必须提供所创建文件的权限

 
#include <unistd.h>
int close(int fd);

close函数关闭打开的文件,进程结束时,系统会自动关闭打开的文件,但如果进程未结束时候则应及时关闭打开的文件,因为系统为每个进程打开的最大文件数目有限制

 

#include <unistd.h>
off_t lseek(int fd, off_t offset, int whence);

lseek函数用来定位文件的位置,offset参数说明文件指针相对于whence移动多少个字节,whence参数有SEEK_SET,SEEK_CUR,SEEK_END三个标志,分别表示文件的首部,当前位置,尾部。当文件以O_APPEND参数打开时,该函数的这三个标志永远相同,都为文件尾部,而且,offset不能为负,即不能修改已写入的文件。由于lseek函数的offset参数可正可负,因此lseek失败时返回值为-1,其他返回值都有可能是成功的返回。

此外,lseek函数只是移动文件指针,并未引起任何的IO操作,该文件指针的位置引用于下一个IO操作

 

#include <unistd.h>
ssize_t read(int fd, void *buf, size_t nbytes);

read函数从fd文件中读入nbytes字节的内容到buf中,成功时返回读入的字节数(有可能小于nbytes),遇到文件末尾是返回0,失败时返回-1

 

#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t nbytes);

write函数将buf中的nbytes字节内容写入fd文件中,成功时返回写入的字节数,失败时返回-1.通常情况下返回值都等于nbytes,否则出现了某些错误

 

#include <unistd.h>
ssize_t pread(int fd, void *buf, size_t nbytes, off_t offset);
ssize_t pwrite(int fd, const void *buf, size_t nbytes, off_t offset);

出错时返回-1,成功时返回读/写的字节数

pread函数相当于先调用lseek再调用read,但是两者有重要区别,一是pread属于原子操作,不可拆分,而先调用lseek在调用read则两次调用中间文件可能被其他进程修改;二是pread不更新当前文件的偏移量

#include <unistd.h>
int dup(int fd);
int dup2(int fd, int fd2);

出错时返回-1,成功时返回新的文件描述符

dup为已经打开的文件返回一个新的文件描述符,该文件描述符一定是当前可用文件描述符中的最小值。dup2则是用fd2参数指定新的文件描述符,如果fd2所指文件已打开,则先关闭fd2所指文件;若fd等于fd2,则返回fd2而不关闭它。

 

#include <fcntl.h>
int fcntl(int fd, int cmd, ... /* int arg */ );

出错时返回-1,成功时依赖于cmd

fcntl函数可以获得/修改文件的属性

cmd = F_DUPFD:复制文件描述符fd,返回新的文件描述符,它是尚未打开的文件描述符中大于或等于第三个参数的最小值

cmd = F_GETFD:返回fd

cmd = F_SETFD:设置新的文件描述符为第三个参数,

cmd = F_GETFL:返回文件状态标志

cmd = F_SETFL:设置文件状态标志(此时需要先得到旧的文件状态标志,与需要设置的文件状态标志按位做 运算,否则会将旧的文件标志所有位置清除


linux 文件编程c语言操作系统调用函数总结(一)