匿名管道 的 管道复制(dup)

本文详细介绍了 Linux 系统中文件描述符复制的两种方法:`dup` 和 `dup2` 函数的使用方法及注意事项。通过具体示例展示了如何通过 `dup` 创建新的文件描述符,以及如何用 `dup2` 来替换已有的文件描述符。

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

int dup(int oldfd);

返回值:

-1-----失败

其他---新的文件描述符

int dup2(int oldfd, int newfd);

返回值:

-1--------失败

其他-----返回newfd新的文件描述符

图解:


PS:

tty表示终端,0,1,2表示含义系统默认为下表:

分类文件--------------描述符------------文件号
标准输入------- STDIN_FILENO----------0
标准输出--------- STDOUT_FILENO-----1
标准出错信息---- STDERR_FILENO ----2

dup示例:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

int main(){
	int fd = dup(STDOUT_FILENO);
	fprintf(fdopen(fd,"w"),"%d printf:Hello dup\n",fd);
}


dup2示例:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#define FILE_MODE (S_IWUSR|S_IRUSR|S_IRGRP|S_IROTH)
int main(){
	int save_fd = dup(STDOUT_FILENO);
	int fd = open("./test",O_CREAT|O_RDWR,FILE_MODE); 
	if(-1 == dup2(fd,STDOUT_FILENO)){
		perror("dup2 error0");
		return 1;
	}
	close(fd);
	printf("%d printf:Hello dup\n",fd);
	fflush(stdout);// 一定要清除缓冲区,否则会输出到终端
	if(-1 == dup2(save_fd,STDOUT_FILENO)){
		perror("dup2 error");
		return 1;
	}
	close(save_fd);
	printf("%d printf:this is save\n",save_fd);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值