apue学习笔记--第三章-- 文件IO

本文详细介绍了Advanced Programming in the UNIX Environment (APUE)中关于文件操作的重要API,包括open、creat、close、lseek、read及write等函数的使用方法与参数说明。通过这些介绍,读者可以更好地理解如何在UNIX环境中进行文件的打开、创建、关闭、定位、读取和写入等操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

学习了apue ,记录下,方便以后继续学习。
int open(const char*pathname, int oflag,.../*, mode_t mode * / ) ;
//成功返回文件描述符,错误返回-1
//oflag 如下,定义在 fcntl.h
//O_RDONLY 只读打开
//O_WRONLY 只写打开
//O_RDWR 读写打开
//
//O_APPEND 追加 
//
//O_CREAT 若文件不存在则创建 需指定mode
//S_IRUSR	用户-读
//S_IWUSR	用户-写
//S_IXUSR	用户-执行
//S_IRGRP	组-读
//S_IWGRP	组-写
//S_IXGRP	组-执行
//S_IROTH	其他-读
//S_IWOTH	其他-写
//S_IXOTH	其他-执行
//
//O_EXCL 如果指定了O_CREAT ,并且文件存在 则出错,他使创建文档成为原子操作
//
//O_TRUNC 如果文件存在 并且只读只写 打开 则将文件长度截断为0

int creat(const char *pathname,mode_t mode)
//成功返回文件描述符 出错返回-1
//他和 open(const char*pathname, O_RDWR|O_CREAT|O_EXCL,mode)等效
int close(int filedes);
//关闭文件描述符,当程序结束,系统会自动调用

off_t lseek(int filedes, off_t offset, int whence);
//成功返回为新的文件位移,出错返回-1
//whence 
//SEEK_SET 起始为文件开头
//SEEK_CUR 当前位移
//SEEK_END 文件末尾
//位移大于文件长度会产生文件空洞

ssize_t read(int filedes,void *buff,size_t nbytes);
//成功返回读取的字节数,已到文件尾为0 出错-1  

ssize_t write(int filedes,const void *buff,size_t nbytes);
//成功返回写入的字节数 出错-1  
       

### APUE 第三章 学习笔记 #### 文件 I/O 基础 APUE第三章主要讨论了 Unix 系统中的文件 I/O 操作基础。这一章节涵盖了多个重要的概念和技术细节,对于理解如何高效地操作文件至关重要。 #### 打开和关闭文件 为了打开一个文件,程序通常会使用 `open` 或者 `creat` 函数[^1]。这两个函数都返回一个小于零的整数作为错误指示,而成功的调用则返回一个非负整数表示新创建的文件描述符。当不再需要访问某个特定文件时,应该通过调用 `close` 来关闭它。这不仅释放了与该文件关联的操作系统资源,而且也使得这个文件描述符能够被重新利用。 ```c #include <fcntl.h> /* For O_* constants */ #include <unistd.h> /* For open(), close() */ int fd; fd = open("example.txt", O_RDWR | O_CREAT, S_IRUSR | S_IWUSR); if (fd >= 0) { // File opened successfully. } // Later... close(fd); ``` #### 文件读写 一旦有了有效的文件描述符,就可以对其进行读取 (`read`) 和写入 (`write`) 操作。这些基本的 I/O 操作允许应用程序直接处理底层的数据流而不必关心具体的设备特性[^2]。 ```c char buffer[BUFSIZ]; ssize_t n; n = read(fd, buffer, BUFSIZ - 1); if (n > 0) { buffer[n] = '\0'; // Null terminate the string printf("%s\n", buffer); } const char *msg = "Hello world!"; write(fd, msg, strlen(msg)); ``` #### 文件定位 除了简单的顺序读写外,还可以改变当前文件偏移量来实现随机访问。这是通过 `lseek` 实现的功能之一,它可以向前或向后移动文件指针的位置以便从不同的位置开始读写数据[^3]。 ```c off_t offset; offset = lseek(fd, SEEK_SET, 0); // Move to beginning of file if (offset != -1L) { // Seek succeeded. } ``` #### 特殊文件类型的支持 Unix 系统支持多种特殊类型的文件对象,比如管道、套接字以及终端设备等。本章还介绍了针对这些不同类型文件的具体 API 接口和支持机制[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值