代码详细注释:演示如何使用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; // 程序正常结束
}
代码功能说明:
文件描述符复制:演示如何使用
dup()
系统调用复制文件描述符文件操作:
打开/创建文件(
open()
)通过不同描述符写入内容(
write()
)关闭文件描述符(
close()
)
关键特性:
复制的文件描述符(
fd2
)与原始描述符(fd1
)共享相同的文件偏移量和状态标志通过任一描述符写入都会影响另一个描述符的文件位置
程序执行效果:
如果文件不存在会创建新文件(权限644)
文件内容将包含:
text
hello world goodbye
注意事项:
注释掉的代码展示了另一种获取文件描述符的方式(直接open)
使用
dup()
复制的描述符与直接open()
的区别在于:dup()
的描述符共享文件偏移量直接
open()
会得到独立的文件描述符