Linux对文件的操作(open read write lseek close)

文件描述符是Linux系统中用于标识已打开文件的索引,由open()和creat()函数返回。open()有多种打开模式,如只读、只写和追加,而creat()用于创建新文件。write()用于写入文件,read()用于读取文件,lseek()调整文件指针位置,close()关闭文件描述符。标准文件描述符0、1、2分别对应标准输入、输出和错误。

文件描述符

        Linux 系统中,把一切都看做是文件(一切皆文件),当进程打开现有文件或创建新文件时,内核向进程返回一个文件描述符,文件描述符就是内核为了高效管理已被打开的文件所创建的索引,用来指向被打开的文件,所有执行I/O操作的系统调用都会通过文件描述符。

0,1,2分别为标准输入,标准输出,标准错误文件描述符。

一、打开与创建(open函数和creat函数)

open函数

open函数的返回值就是文件的描述符。后续的读(read)写(write)都围绕这这个描述符来操作。

函数原型:

int open(const char *pathname, int flags);

返回值:一个小的整型数,也就是该文件的文件描述符

int open(const char *pathname, int flags, mode_t mode);

返回值::一个小的整型数,也就是该文件的文件描述符

参数说明:
pathname: 要打开的文件名(含路径,缺省为当前路径)
flags:
O_RDONLY 只读打开  
O_WRONLY 只写打开  
O_RDWR  可读可写打开
当我们附带了权限后,打开的文件就只能按照这种权限来操作。以上这三个权限只能制定其中一个。下列参数是可以选的:
O_CREAT:若文件不存在则创建它。使用此选项时,需要同时说明第三个参数mode。用其说明该新文件的存取许可权限。可读4、可写2、可执行1。例如0600:可读可写。
O_EXCL:若|同时使用了O_CREAT,而文件已经存在,则出错。意思就是open()函数的返回值为-1。 

O_APPEND:每次写时都加入到文件的尾端。例如:原文件的内容是123,新写入的内容为456,那么新文件的内容为123456。
O_TRUNC:如果文件中是有内容的,而且为只读或只写方式打开成功,则将其长度截短为0。例如:原文件的内容为123456,打开后就没有内容了,后续新写入了123,那么新文件的内容就为123。

mode:文件的权限   可读为4,可写为2,可执行为1;如0600,表示该文件的文件拥着者的权限为可读可写,0700,表示可读可写可执行。

用例:

int fd;
fd=open("./file1",O_RDWR);//在当前路径打以可读可写的方式开了file1文件。
int fd;
fd=open("./file1",O_RDWR|O_CREAT,0600);/*在当前路径打以可读可写的方式开了file1文件,
如果没有该文件则创建一个file1文件,文件拥有者的权限为可读可写*/

creat函数

同样creat函数的返回值也是文件描述符。

函数原型:

 int creat(const char *pathname, mode_t mode);

返回值:一个小的整型数,也就是该文件的文件描述符

参数说明:

pathname:文件名(含路径,缺省为当前路径)

mode:创建模式。 

宏表示 数字  意义
S_IRUSR4可读
S_IWUSR 2可写
S_IXUSR 1可执行
S_IRWXR 7可读可写可执行

用例:

int fd;//creat函数使用时数字表示和宏表示都可以的,如下两种表示方法是等价的。
fd=creat("./file1",S_IRWSR);//在当前路径创建了可读可写的file1文件。
fd=creat("./file2",0600);//在当前路径创建了可读可写的file2文件。

二、对文件的写入(write函数)

函数原型:

ssize_t write(int fd, const void *buf, size_t count);
返回值:写入文件的字符个数

参数说明:

fd:文件描述符

buf:用来存放要写入的内容

count:要写入的字节数

用例:

int fd;
fd=open("./file",O_RDWR|O_CREAT,0600);

char *buf="hello world";
write(fd,buf,strlen(buf));//把buf中的字符串写到文件fd中,写了strlen(buf)个字节数

三、对文件的读取(read函数)

函数原型:

 ssize_t read(int fd, void *buf, size_t count);
返回值:从文件中读取的字节数

参数说明:

fd:文件描述符

buf:用来存放从文件中读取的内容

count:要读取的字节数

用例:

int fd;
fd=open("./file",O_RDWR|O_CREAT,0600);

char readbuf[128];
read(fd,readbuf,5);//把fd文件前5个字节读取到readbuf中

四、文件的光标移动问题(lseek函数)

在对文件进行写入和读取时要注意光标的位置,否则会产生写入位置不正确,和读取不到内容的情况,此时需要使用lseek函数来对文件的光标位置进行调整。

函数原型:

 off_t lseek(int fd, off_t offset, int whence);
返回值:调用成功会返回当前读写位置相对于文件头部起始位置的偏移量,利用这一特性,可以算出文件的大小

int fileSize;
fileSize=lseek(fd,0,SEEK_END);//将光标置于文件末尾,偏移0个字节,返回的值就是文件的大小。

参数说明:

fd:文件描述符

offse:光标偏移的字节数

whence:用于定义参数 offset 偏移量对应的参考值

宏定义
SEEK_SET光标置于文件的起始位置
SEEK_CUR光标就置于文件的光标的当前位置
SEEK_END光标置于文件的末尾

用例:

lseek(fd,0,SEEK_SET);//光标置于文件开头偏移0个字节。将光标移到开头的位置
lseek(fd,0,SEEK_END);//光标置于文件尾巴偏移0个字节。将光标移到尾巴的位置

五、文件的关闭(close函数)

close()关闭一个文件描述符,这样它就不再引用任何文件,可以被重用。

函数原型:

 int close(int fd);

返回值:成功返回0,失败返回-1;

参数说明:

fd:文件描述符

用例:

close(fd);//关闭文件fd

<think>好的,用户现在想了解Linux文件操作openwriteclose等函数的具体示例与用法。我需要根据他们提供的引用内容来组织回答,并确保符合之前提到的格式要求,比如使用中文、行内数学表达式用$...$,独立公式用$$...$$,还有生成相关问题。 首先,我得回顾用户提供的引用内容。引用[1]到[5]主要涉及openwriteclose等系统调用的使用示例和基本概念。比如引用[2]提到open函数的参数和返回值,引用[3]和[4]给出了具体的代码示例,引用[5]则区分了系统调用和C库函数的不同。用户之前的问题是关于打开文件夹的,现在转向文件操作函数,可能是在深入学习Linux文件管理。 接下来,我需要整理这些信息,分步骤解释每个函数的用法,并附上示例代码。用户可能需要了解函数原型、参数意义、返回值以及常见错误处理。例如,open函数的flags参数如O_RDWR、O_CREAT等,mode参数的权限设置,write函数如何写入数据,close的作用等。同时,要注意用户可能遇到的权限问题,比如如何正确设置文件权限,或者在打开文件时处理错误。 需要确保代码示例正确,并符合用户提供的引用中的写法。比如引用[3]中的代码结构,包含头文件、错误检查、写操作后的关闭等。同时,要指出系统调用和库函数的不同,如引用[5]提到的open是系统调用,而fopen是库函数,这可能在回答中需要提及,帮助用户理解两者的区别。 可能还需要考虑用户的实际应用场景,比如创建新文件、追加内容、读取数据等,给出不同的示例。例如,使用O_APPEND标志在文件末尾追加内容,或者使用lseek调整文件偏移量。同时,错误处理是关键,比如检查返回值是否为-1,并处理相应的错误情况。 在组织内容时,按照函数分点,每个函数下说明用途、参数、返回值、示例和注意事项。这样结构清晰,方便用户逐步学习。此外,用户可能对权限设置(如S_IRUSR)不太熟悉,需要解释这些宏的含义,以及如何组合使用。 最后,生成相关问题时要考虑用户可能的后续疑问,比如错误处理的最佳实践、不同打开模式的影响、系统调用与库函数的性能差异等。确保问题覆盖用户可能深入学习的方面。</think>在Linux系统中,文件操作的核心系统调用函数包括$open()$、$write()$和$close()$。以下为详细用法及示例: ### 一、open函数 #### 1. 函数原型与参数 ```c #include <fcntl.h> int open(const char *pathname, int flags, mode_t mode); ``` - **参数说明**: - `pathname`:文件路径(如`"a.txt"`) - `flags`:打开方式组合(必选项:$O_RDONLY$, $O_WRONLY$, $O_RDWR$;可选项:$O_CREAT$, $O_TRUNC$等) - `mode`:文件权限(当使用$O_CREAT$时需指定,如$S_IRUSR | S_IWUSR$) #### 2. 使用示例 ```c // 打开已存在文件(读写模式) int fd = open("test.txt", O_RDWR); if (fd == -1) { perror("文件打开失败"); } // 创建新文件(若不存在)并截断为0字节 fd = open("newfile.txt", O_RDWR | O_CREAT | O_TRUNC, 0644); ``` [^1][^2][^4] ### 二、write函数 #### 1. 函数原型与参数 ```c #include <unistd.h> ssize_t write(int fd, const void *buf, size_t count); ``` - **参数说明**: - `fd`:由$open()$返回的文件描述符 - `buf`:要写入的数据缓冲区 - `count`:写入字节数 #### 2. 使用示例 ```c char data[] = "Linux文件操作示例\n"; ssize_t bytes_written = write(fd, data, strlen(data)); if (bytes_written == -1) { perror("写入失败"); } else { printf("成功写入%zd字节\n", bytes_written); } ``` [^3][^4] ### 三、close函数 #### 1. 函数原型 ```c #include <unistd.h> int close(int fd); ``` - **作用**:释放文件描述符资源 #### 2. 使用示例 ```c if (close(fd) == -1) { perror("文件关闭失败"); } ``` ### 四、完整操作示例 ```c #include <fcntl.h> #include <unistd.h> #include <string.h> int main() { int fd = open("demo.txt", O_RDWR | O_CREAT, 0644); if (fd == -1) return -1; const char *content = "Hello Linux IO\n"; write(fd, content, strlen(content)); lseek(fd, 0, SEEK_SET); // 重置文件指针 char buffer[256]; ssize_t bytes_read = read(fd, buffer, sizeof(buffer)); if (bytes_read > 0) { printf("读取内容: %.*s", (int)bytes_read, buffer); } close(fd); return 0; } ``` [^4] ### 五、注意事项 1. **错误处理**:所有系统调用都应检查返回值(如$if (fd == -1)$) 2. **权限控制**:使用$O_CREAT$时必须指定$mode$参数(如$0644$表示`rw-r--r--`) 3. **文件描述符复用**:通过$lseek()$可调整读写位置 4. **系统调用与库函数**:$open()$是系统级API,而$fopen()$是C标准库函数[^5]
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值