当前位置: 首页 > news >正文

代码详细注释:演示如何使用dup()系统调用复制文件描述符

代码

/*03 - 复制文件描述符 */
#include <stdio.h>                      // 标准输入输出头文件
#include <stdlib.h>                     // 标准库头文件
#include <string.h>                     // 字符串处理头文件
#include <unistd.h>                     // UNIX标准头文件(包含dup函数)
#include <fcntl.h>                      // 文件控制头文件(包含文件打开模式定义)
#include <sys/types.h>                  // 系统数据类型头文件
#include <sys/stat.h>                   // 文件状态头文件
#include <sys/time.h>                   // 时间相关头文件
#include <time.h>                       // 时间处理头文件int main(int argc, char *argv[])        // 主函数
{int fd1, fd2;                       // 定义两个文件描述符变量char buf[1024];                     // 缓冲区int n;                              // 临时变量(实际未使用)if (argc != 2) {                    // 检查参数数量是否正确printf("Usage: %s <file>\n", argv[0]);  // 打印使用说明exit(1);                        // 退出程序}// 打开文件(不存在则创建)fd1 = open(argv[1], O_RDWR|O_CREAT, 0644);  // 以读写模式打开文件,权限644if (fd1 == -1) {                   // 检查文件是否成功打开perror("open");                 // 打印错误信息exit(1);                        // 退出程序}// 注释掉的代码:另一种方式获取第二个文件描述符/*fd2 = open(argv[1], O_RDWR|O_CREAT, 0644);if (fd2 == -1) {perror("open");exit(1);}*/// 复制文件描述符(使用dup)fd2 = dup(fd1);                     // 复制fd1得到新的文件描述符fd2// 通过第一个文件描述符写入内容write(fd1, "hello world\n", 12);    // 写入12字节数据// 通过第二个文件描述符写入内容(会追加在上次写入之后)write(fd2, "goodbye\n", 8);         // 写入8字节数据close(fd1);                         // 关闭第一个文件描述符close(fd2);                         // 关闭第二个文件描述符return 0;                           // 程序正常结束
}

代码功能说明:

  1. 文件描述符复制:演示如何使用dup()系统调用复制文件描述符

  2. 文件操作

    • 打开/创建文件(open())

    • 通过不同描述符写入内容(write())

    • 关闭文件描述符(close())

  3. 关键特性

    • 复制的文件描述符(fd2)与原始描述符(fd1)共享相同的文件偏移量和状态标志

    • 通过任一描述符写入都会影响另一个描述符的文件位置

程序执行效果:

  1. 如果文件不存在会创建新文件(权限644)

  2. 文件内容将包含:

text

hello world
goodbye

注意事项:

  1. 注释掉的代码展示了另一种获取文件描述符的方式(直接open)

  2. 使用dup()复制的描述符与直接open()的区别在于:

    • dup()的描述符共享文件偏移量

    • 直接open()会得到独立的文件描述符

http://www.dtcms.com/a/269587.html

相关文章:

  • Linux操作系统:再谈虚拟地址空间
  • const char* 、char*和char[]的区别
  • MySQL数据库访问(C/C++)
  • 恒创科技:香港站群服务器做seo站群优化效果如何
  • 2025年数据挖掘与计算机科学国际会议 (DMCS 2025)
  • 基于Docker Compose部署Traccar容器与主机MySQL的完整指南
  • 专题:2025数据资产AI价值化:安全、战略与应用报告|附400+份报告PDF、原数据表汇总下载
  • uniapp 监听物理返回按钮
  • 分水岭算法:图像分割的浸水原理
  • 视频号账号矩阵运营中定制开发开源 AI 智能名片 S2B2C 商城小程序的赋能研究
  • 【王树森推荐系统】召回11:地理位置召回、作者召回、缓存召回
  • 【Rust base64库】Rust bas64编码解码详细解析与应用实战
  • ​​​​​​​营销费用管理,如何驱动快消企业营销投资战略升级
  • 萌新赛第(一)场
  • IEEE Fellowe助力 2025年物联网、数据科学与先进计算国际学术会议(IDSAC2025)
  • C++——string的了解和使用
  • 将oracle表字段json字符串分解提取并返回单列表
  • Redis基础数据结构
  • 深度学习与图像处理 | 基于传统图像处理的自动驾驶车道线检测
  • XSLT注入与安全修复方法
  • 【快手】数据挖掘面试题0002:求某地铁站每日客流量,乘地铁经过、进出站人都包括在内
  • C#随机数生成全面详解:从基础到高级应用
  • 【ROS2 自动驾驶学习】03-ROS2常用命令
  • 网络安全护网实战:攻击手段解析与防御策略
  • 基于odoo17的设计模式详解---工厂模式
  • 阿里云mysql数据丢失,如何通过服务器备份在其他服务器上恢复数据,并获取mysql丢失数据,完成mysql数据恢复
  • Prompt Injection Attack to Tool Selection in LLM Agents
  • 深度剖析:向70岁老系统植入通信芯片——MCP注入构建未来级分布式通信
  • IP 能ping通,服务器是否开机?
  • Go语言反射机制详解