Linux-open、read、write函数

1、open函数

#include
#include //close函数头文件

#include //open函数头文件
#include //open函数头文件
#include //flags参数头文件

//返回值为对应文件的描述符,打开失败返回-1
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
//参数 pathname为文件路径
//参数 flags为文件操作权限
//参数 mode为当文件被创建时,附加文件的初始分为权限 rwx

详细使用可以使用Linux命令:man 2 open

flags参数:(注意这里可以使用 |来添加多个参数),如:

int fd = open("./test.txt",O_RDWR | O_CREAT, 0644);
close(fd);

flags三个访问权限参数:(注意这三个参数在flags中只能出现其中一个

O_RDONLY:只读         

O_WRONLY:只写         

O_RDWR:读写

flags其他参数:

O_CREAT:若文件不存在则创建它。

补充:需要同时使用open的第三个参数mode,为新文件添加访问权限。

O_EXCL:在使用O_CREAT参数创建文件,而文件已经存在时报错。       

O_APPEND:将新写入的数据放到文件的末尾,不会覆盖前面已有的数据。

O_TRUNC:它表示以截断的方式打开文件。当以O_TRUNC标志打开文件时,如果文件已经存在,那么文件的内容会被清空;如果文件不存在,那么会创建一个新的空文件。

mode参数:

表示设置文件访问权限的初始值,比如0644表示-rw-r–r–,也可以用S_IRUSR、S_IWUSR等宏定义按位或起来表示,具体情况可以百度 或者 man 2 open命令

注意点:创建权限时,受当前进程的umask影响,

具体情况为:最终权限 = mode & ~umask

查询当前进程的umask的方法:直接运行命令(umask) 

例如umask输出002则~umask为775,然后mode会和775进行&运算,

即使你输入的是0777,那么最终的权限也会是775

2、read和write函数

#include
//失败均返回-1
ssize_t read(int fd, void *buf, size_t count);
size_t write(int fd, const void *buf, size_t count);

fd参数:文件描述符

buf参数:缓冲区,用于存放接受的数据或者需要写入的数据。

(注意:buf是一个指向字符数组的指针,所以不能用指针代替数组)如:

#include
#include
#include
#include
#include
#include
using namespace std;

int main(int argc,char *argv[]){
    int fd1;
    fd1 = open("./openfile.txt", O_RDWR);
    printf("fd1 = %d\n", fd1);

    int fd2;
    fd2 = open("./copytest.txt", O_RDWR | O_CREAT | O_TRUNC, 0777);
    
    char buf[1024];//这里只能用数组,而不能用 char *buf
    int size_re=0;
    while((size_re=read(fd1,buf,1024))!=0){
        cout<

count参数:

read:缓冲区的大小

write:写入数据的大小

记录:因为很少用文件函数,所以在一次线下面试的过程中,对方让我手写一个读文件的函数,我直接呆住了,我知道open和read函数,但是让我用手写瞬间就呆住了,不知道怎么下手,可能是太紧张的问题,10秒后我放弃了,可是手写函数真的很呆啊,那些参数我记不得哇。<-.->!

你可能感兴趣的:(Linux后台,linux)