linux下文件的读写操作讲解(及open函数的flags讲解)

1.文件的读写代码演示:

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>

int main(void)
{
        int fd = -1;
        char readBuf[100] = {0};
        char read2Buf[100] = {0};
        char writeBuf[100] = "I love linux";
        int ret = 0;

        //第一步:打开文件
        //int open(const char *pathname, int flags);
        //int open(const char *pathname, int flags, mode_t mode);

        fd = open("a.txt",O_RDWR);
        if(-1 == fd)
        {
                printf("文件打开失败\n");
			_exit(-1);	
        }
        else
        {
                printf("打开成功\n");
                printf("fd = %d\n",fd);
        }

        //第二步:读文件
        //ssize_t read(int fd, void *buf, size_t count); 
        //fd表示要读取那一个文件
        //buf是应用程序自己提供的一段内存缓冲区,用来存储文件的内容
        //count是我们要读取的字节数
        //返回值ssize_t类型是内核用typedef重定义的一个类型(就是int)返回值表示成功读取的字节数
        ret = read(fd,readBuf,20);
        if(ret == -1)
        {
                printf("读取失败\n");
                _exit(-1);
        }
        else
		{
                printf("实际读取了%d个字节\n",ret);
                printf("读取文件的内容是:%s\n",readBuf);
        }

        //第三步:写文件
        //ssize_t write(int fd, const void *buf, size_t count);
        ret = write(fd,writeBuf,strlen(writeBuf));
        if(ret < 0)
        {
                printf("写入失败\n");
                _exit(-1);
        }
        else
        {
                printf("写入了%d个字节\n",ret);
                printf("写入的内容是%s\n",writeBuf);

        }

        //移动光标
        //off_t lseek(int fd, off_t offset, int whence);
        lseek(fd,0,0);

        ret = read(fd,readBuf,30);
        if(ret == -1)
        {
                printf("读取失败\n");
                _exit(-1);
        }
        else
        {
                printf("实际读取了%d个字节\n",ret);
                printf("读取文件的内容是:%s\n",read2Buf);
        }


        //第四步:关闭文件
        //int close(int fd);
        close(fd);
        printf("文件关闭\n");

        return 0;
}

注意:这里open的flags是指对文件操作的权限O_RDWR(可读可写)、O_RDONLY(只读)、O_WRONLY(只写)。

2.当打开一个已经存在并且内部有内容的文件时会怎么样?
(1)O_TRUNC属性去打开一个这样的文件时,原来文件中的内容会被丢弃。
(2)O_APPEND属性去打开一个这样的文件时,新写入的内容会在原有内容的后面。如果这两个属性同时出现,会将原有的内容删除,只打印当前写入的内容。

3.当打开一个文件时并不存在应该怎么办?
属性O_CREAT就是解决办法,当打开这个文件不存在时他会帮你创建并打开这个文件。如果这个文件已经存在,则会重新创建这个文件,原有的内容可能被消除。(这样可能会造成不好的效果,这时属性O_EXCL和O_CREAT结合使用就会避免这个错误,没有这个文件时就会创建这个文件,这个文件已经存在则会报错)。且当使用O_CREAT这个属性时open的第三个参数mode位就会给这个文件赋值相应的权限。

4.当我们程序中途出错时我们应该用exit、_exit、_Exit退出程序。
在main函数中一般用return 0;表示程序正常终止,return-1;表示程序异常终止。
正式终止进程(程序):应该使用exit或_Exit或_exit他们包含的头文件不同,用man手册查找。

5.阻塞与非阻塞(O_NONBLOCK)
(1)阻塞式:我们调用这个函数时,当前进程有可能被卡住,,实质就是函数内部要完成的事情条件不具备,要等条件成熟,这时函数不能被立即返回。
(2)非阻塞:调用这个函数后立即返回,但是函数任务是否完成不确定。
(3)操作系统提供的API和由API封装成的库函数,有些是阻塞式有些是非阻塞式,我们调用时应该要清楚。如果我们打开一个文件默认是阻塞式,但是我们希望以非阻塞方式打开,则flags中加O_NONBLOCK属性。这个属性只用于设备文件,而不用于普通文件。

6.O_SYNC
(1)write阻塞等待底层完成写入才返回到应用层
(2)无O_SYNC只是将内容写到底层缓冲区即可返回,底层就是负责实现open、write、这些操作的代码,也包含了OS中读写硬盘底层硬件的代码,在合适的时候将buf中的内容一次性同步到硬盘中,这种设计为了提升硬件操作的性能和寿命,当我们希望硬件不等待,直接将我们的内容写到硬盘中时,就可以调用O_SYNC标志;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: open函数Linux系统中的一个系统调用,用于打开文件或创建文件。它的原型为: int open(const char *pathname, int flags); 其中,pathname是要打开或创建的文件的路径名,flags是打开文件的方式和权限标志。open函数返回一个文件描述符,用于后续的读写操作。如果打开或创建文件失败,open函数返回-1。 ### 回答2: 在Linux环境下,Open()是一个十分重要的函数,主要用于打开文件open()函数的用法如下: int open(const char *pathname, int flags); open()函数接受两个参数,第一个参数是文件路径,第二个参数是打开模式。Linux中有一个system call table,open()函数是其中的一项。当我们调用open()函数时,系统会根据路径找到对应的文件,然后将它映射到内存中,接着返回一个file descriptor(文件描述符)。 open()函数支持的标志包括:O_RDONLY、O_WRONLY、O_RDWR、O_CREAT、O_EXCL、O_TRUNC、O_APPEND等。其中,O_RDONLY表示只读模式,O_RDWR表示读写模式,O_CREAT用来创建文件,O_EXCL表示如果文件存在则返回一个错误,O_TRUNC表示清空文件内容,O_APPEND表示在文件末尾添加内容。 在系统调用open()时,系统会根据打开文件的模式匹配已存在的文件句柄。如果文件句柄存在,系统会返回一个已存在的文件描述符;如果文件句柄不存在,系统会为其分配一个新的文件描述符。通常情况下,文件描述符是一组连续的整数,其中0、1、2分别代表标准输入、标准输出、标准错误输出。 open()函数在实际应用中十分常见,可以用来打开文本文件、二进制文件、设备文件等。它利用文件描述符实现文件读写和管理,是Linux系统中不可或缺的一部分。 ### 回答3: 在Linux中,open函数是用于打开文件的系统调用之一。通过open函数,我们可以打开一个文件并获取一个文件描述符(file descriptor),这个文件描述符可以被用于读取、写入和关闭文件open函数的定义如下: ``` #include <fcntl.h> int open(const char *pathname, int flags, mode_t mode); ``` 其中,pathname表示要打开的文件路径,flags是打开文件的方式,mode是文件的访问权限。 open函数的返回值是一个非负整数,它表示文件描述符。如果出错,则返回-1,并设置errno。 其中,flags参数可以是以下数值之一或它们的组合: - O_RDONLY:只读方式打开文件 - O_WRONLY:只写方式打开文件 - O_RDWR:读写方式打开文件 - O_CREAT:如果文件不存在,则创建它 - O_TRUNC:如果文件已存在,则将其长度截短为0 - O_APPEND:文件的写入位置为文件的末尾 - O_EXCL:与O_CREAT一起使用,要求文件不存在,否则返回出错信息 mode参数是一个权限掩码(mode mask),它用于指定新创建的文件的访问权限。使用mode参数需要注意以下几点: - 只有在O_CREAT标记的情况下,mode参数才会生效。 - mode参数是一个八进制数,其中每一位分别指定了对应的读取、写入和执行权限。例如,0666表示所有用户都可以读、写该文件。 - mode参数的值在不同的环境下有不同的默认值。通常情况下,新创建的文件的权限掩码为0666,新创建的目录的权限掩码为0777。 在代码中使用open函数时,需要注意以下几个方面: - open函数的返回值需要判断是否为-1,如果为-1则说明打开文件失败。 - 打开成功的文件需要在使用完毕后使用close函数关闭文件描述符。 - 如果打开文件时使用了O_CREAT标记,则需要在mode参数中指定文件的访问权限。 总之,open函数Linux下常用的系统调用之一,它可以帮助我们打开文件并获取文件描述符,使得对文件的读写等操作变得更加方便。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值