写一个与dup2()功能相同的函数

重定向dup2()函数 重定向stdin stdout stderr dup()   dup2()都是用于重定向 dup函数的作用:复制一个现有的句柄,产生一个与“源句柄特性”完全一样的新句柄(也即生成一个新的句柄号,并关联到同一个设备)dup2函数的作用:复制一个现有的句柄到另一个句柄上,目标句柄的特性与“源句柄特性”完全一样(也即首先关闭目标句柄,与设备断连#include #include 阅读详情
//用dup()来返回文件描述符,直到符合要求的为止,最后再把不符合要求的关闭
//2013年 06月 19日 星期三 06:23:38 HKT
//当输入的描述符是负的或者已超过MAX_OPEN时,会出错
#include <unistd.h>//dup()
#include <stdio.h>
#include <stdlib.h>
#define OPEN_MAX 256
int my_dup2(int, int);
int main(int argc, char *argv[])
{
	int newfd, return_fd;
	if(argc != 2)
	{
		printf("格式:./a.out test.txt\n");
		exit(0);
	}
	printf("请输入你要设置复制的描述符: ");
	scanf("%d", &newfd);
	//打开一个文件
	int fd = open(argv[1], 0);//打开一个文件准备复制
	if(fd == -1)
	{
		perror(argv[1]);//打印错误信息
		exit(0);
	}
	printf("原来的文件描述符是: %d\n", fd);
	return_fd = my_dup2(fd, newfd);
	printf("之后的文件描述符是: %d\n");
        close(fd);
        close(return_fd);
        exit(0);
}
int my_dup2(int fd, int newfd)
{
	int count = 0;
	int fdarry[newfd];	//记录打开的描述符
	if(newfd < 0 || newfd > OPEN_MAX)
	{
		printf("你设置的新描述符有误!\n");
		exit(0);
	}

	if((fdarry[count] = dup(fd)) == -1)//返回当前最小未用的文件描述符
	{
		printf("dup()函数出错!\n");
		exit(0);
	}
	else//的是为了测试原文件描述符是否可用
	{
		close(fdarry[count]);	
	}
	if(fd == newfd)//如果新设置的与原来的相等则直接接返回原来的
	{
		return fd;
	}
	close(newfd);//关闭要复制的文件描述符
	//当运行下面的代码时说明用户设置的文件描述符与一开始的并不相同
	for(count = 0; count <= newfd; count++)
	{
		fdarry[count] = dup(fd);//返回当前可用的最小文件描述符
		if(fdarry[count] == -1)
		{
			printf("dup()出错!\n");
			exit(0);
		}
		else
		{
			printf("for里面的描述符为: %d\n", fdarry[count]);
			if(fdarry[count] == newfd)
				break;
		}
	}
	for(count = 0; count <= newfd; count++)
	{
		if(fdarry[count] == newfd)
			return fdarry[count];
		else
			close(fdarry[count]);	
	}
}


原子操作与程序中的重定向: dup()与dup2()函数 阅读详情

相关推荐

从零开始:TexLive(Latex)安装与配置全指南

本文提供了一份详尽的TexLive(Latex)安装与配置全指南,旨在帮助用户从零开始快速搭建LaTeX工作环境。内容涵盖从镜像下载、安装步骤详解、环境验证到高效编辑器(如VS Code)配置,并特别强调了中文排版支持与宏包管理,确保用户能顺利处理学术论文等专业文档的排版需求。

weixin_29284885的博客 903

文件描述符复制函数dup2()详解

dup2()是dup()的“升级版“,原型是int dup2(int oldfd, int newfd),作用是让文件描述符newfd与oldfd所关联的文件(或缓冲区或管道或共享内存等)关联起来,如果一开始newfd已经和某个文件关联了(一个描述符同一时刻只能关联一个文件),那它会先解除newfd和某个文件的关联,然后再关联oldfd关联的那个文件。下面就拿文件描述符0,1做参数来写两个例子。 ...

m0_37829435的博客 2163

5个实战必备的多模态情感分析数据集(附下载链接与避坑指南)

本文精选了5个实战必备的多模态情感分析数据集,包括CMU-MOSEI、CH-SIMS、UR-FUNNY、MUStARD和IEMOCAP,并提供了详细的下载链接与避坑指南。文章重点介绍了如何高效获取、预处理这些数据集,并自然整合了多模态情感分析的核心热词,旨在帮助研究者和开发者快速启动项目,规避常见陷阱,聚焦模型创新。

yolo5detector的博客 280

复制文件描述符(dup、dup2函数) 和 文件共享

所谓文件共享指的是同一个文件(譬如磁盘上的同一个文件,对应同一个 inode)被多个独立的读写体同时进行 IO 操作。多个独立的读写体大家可以将其简单地理解为对应于同一个文件的多个不同的文件描述符,譬如多次打开同一个文件所得到的多个不同的 fd,或使用 dup()(或 dup2)函数复制得到的多个不同的 fd 等。

Bit_Dong的博客 1694

AMCL代码详解(六)amcl中的重采样

每次都从w1左边的竖线开始转,显而易见,转到w1的概率为0-w1之间的随机数,转到w2的概率为w1到w1+w2之间的随机数,转到w3的概率为w1+w2到w1+w2+w3之间的随机数,后面的依次类推。当某个粒子的权值较大的时候,产生的随机数落在相应区间的概率就会增大,从而实现了对权值大粒子的多次复制,权值小的粒子的剔除。可以看出,在整个重采样的过程中,粒子进行了两次种情况的刷新,一种是随机生成的新的粒子,一种是对原来的粒子的复制。得到的值越大,说明粒子的权重越小,当前粒子的可信度比较小,需要重采样粒子。

YiYeZhiNian的博客 1578

基于STM32与毫米波雷达的非接触式睡眠监测系统

物联网和嵌入式系统技术正在推动医疗健康设备的智能化发展。通过传感器网络采集生理信号,结合信号处理算法实现健康监测已成为主流技术方案。毫米波雷达凭借其非接触检测特性,在呼吸、心率等生命体征监测中展现出独特优势。STM32系列MCU凭借丰富外设和低功耗特性,成为医疗级嵌入式设备的首选平台。本系统整合60GHz毫米波雷达、红外测温与无线传输模块,构建了完整的睡眠质量评估解决方案,其硬件架构设计、信号处理算法和低功耗优化策略对可穿戴医疗设备开发具有参考价值。

weixin_36369848的博客 612

文件操作(五)—— 文件重定向(dup2)

文件操作(五)—— 文件重定向(dup2)

challenglistic的博客 5200

基于非接触式微波雷达设计的睡眠监控系统_323

本项目设计了一种基于非接触式微波雷达的睡眠监控系统,通过高精度的生理信号采集与分析,帮助用户全面了解自身的睡眠状态和健康状况。系统采用60GHz频段的R60ABD1毫米波雷达模块,实现对人体呼吸频率、心率、活动状态、体动幅度等参数的非接触式测量;结合MLX90614红外体温传感器,能够实时监测人体体温。此外,系统通过蜂鸣器报警和数据上云功能,及时向用户反馈异常生理指标,确保健康风险早期预警。数据通过ESP8266-WIFI模块上传至华为云物联网平台,用户可通过Android手机APP和Windows上位机远

499

dup/dup2函数

#include <unistd.h> int dup(int oldfd); int dup2(int oldfd, int newfd);   当调用dup函数时,内核在进程中创建一个新的文件描述符,此描述符是当前可用文件描述符的最小数值,这个文件描述符指向oldfd所拥有的文件表项。   dup2和dup的区别就是可以用newfd参数指定新描述符的数值,如果newfd已经打开,则先将其关闭。如果newfd等于oldfd,则dup2返回newfd, 而不关闭它。dup2函数返回的新文件描述

$好记性还是要多记录$ 3296

手把手教您 Claude 桌面端无需账号订阅,免费接入国产自定义大模型(Claude Desktop 绕过订阅限制,接入任意自定义 AI 模型)

无需官方账号,也能畅玩Claude桌面端!本文详解Claude Desktop如何跳过登入接入自定义大模型,轻松解锁Cowork、Code等强大功能🚀

XiaoqiangClub的博客 5410

倍福PLC--PERSISTENT断电保持数据和BOOT中各文件对应的解析

将D:\TC3程序\TwinCAT Project146\TwinCAT RT(x86)\Plc 文件夹的中三个替换文件复制到:G:\TwinCAT\3.1\Boot\Plc完成替换,如下图。(2) 找到程序所存的路径,编程电脑的D:\TC3程序\TwinCAT Project146路径下,并选择对应系统平台TwinCAT RT(x86)(3) 控制器断电,拔出内存卡,使用读卡器,在编程电脑中打开:(本次测试读卡器为G盘)(5) 开机完成后,TwinCAT自动运行,当前闪灯频率为50ms。

weixin_41883890的博客 2340

dup2()实现重定向

函数返回一个整数值,表示复制后的文件描述符。如果复制成功,则返回新的文件描述符;如果出现错误,则返回 -1,并设置相应的错误码。函数创建或打开一个名为 "output.txt" 的文件,并获得一个文件描述符。函数通常与文件操作和进程间通信等场景配合使用,以实现文件描述符的重定向或复制。函数是一个系统调用,用于复制文件描述符,并将其关联到指定的文件描述符。这样,所有后续的标准输出将写入到 "output.txt" 文件中。已经打开,则先关闭它,然后再进行复制操作。函数将标准输出的文件描述符。

tiffany_263的博客 872

YOLOv8 眼底病变检测(眼底照片)详细说明

本文介绍了基于YOLOv8的眼底病变自动检测系统。该系统可识别糖尿病视网膜病变、青光眼等5类常见眼底病变,包括微动脉瘤、出血点等特征。核心技术包含图像预处理、模型训练、病变检测与量化分析三个模块,采用1024×1024高分辨率输入,针对医学图像特点优化数据增强策略。系统支持批量处理、可视化标注和临床报告生成,提供病变数量、面积密度和严重程度评分等量化指标。特别强调医学合规性要求,需专业医生参与数据标注和模型验证,符合医疗器械认证标准。该系统可作为眼科医生的辅助诊断工具,提高眼底病变筛查效率。

u010117029的博客 133

浅析dup()和dup2()函数

前言   在linux下,一切皆文件。当文件被打开时,会返回文件描述符用于操作该文件,从shell中运行一个进程,默认会有3个文件描述符存在(0、1、2);)0表示标准输入,1表示标准输出,2表示标准错误。一个进程当前有哪些打开的文件描述符可以通过/proc/进程ID/fd目录查看。   今天,我们主要说两个用于复制文件描述符的函数dup()和dup2()。 dup()、dup2()函数 ...

编程随笔与杂谈 1万+

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

APUE学习手札 编写一个与3.12节中dup2功能相同的函数,要求不调用fcntl函数,并且要有正确的出错处理

3.2 编写一个与3.12节中dup2功能相同的函数,要求不调用fcntl函数,并且要有正确的出错处理。 思路,不断执行dup函数,直到返回与newfd相同的文件描述符,所有都执行结束之后关闭之前dup返回的文件描述符 不要忘记特判newfd和fd相同的情况,直接返回。记住dup2还多了一歩先关闭newfd的步骤 #include "apue.h" #define BUFFSIZE 16 int main() { char buffer[BUFFSIZE]; int fdin,fdout,n;

菱形继承 1719

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Linux dup、dup2函数

两者不同点:dup复制到最小的文件描述符,dup2复制指定的newfd的值。

weixin_43349440的博客 1563

dup()、dup2()函数

dup和dup2也是两个非常有用的调用,它们的作用都是用来复制一个文件的描述符。它们经常用来重定向进程的stdin、stdout和stderr。这两个函数的 原形如下: #include  int dup( int oldfd ); int dup2( int oldfd, int targetfd )利用函数dup,我们可以复制一个描述符。传给该函数一个既有的描述符,它就会返回一个新的描述符,这

jilily的专栏 1641

九、Linux之dup和dup2函数

九、dup和dup2函数 目录:九、dup和dup2函数一、dup(duplicate)重定向1.文件描述符重定向2.dup()函数原型int dup(int oldfd);3.dup2()函数原型int dup2(int oldfd, int newfd); 一、dup(duplicate)重定向 1.文件描述符重定向 即 new_fd > old_fd,假设文件描述符 old_fd 指向某文件,则 new_fd 重定向于 old_fd 后,文件描述符 new_fd 也指向 old_fd; 最终,

~宪宪的博客 1208

linux c 编程 dup()、dup2()、dup3()函数

1.描述 复制文件描述符。 dup() dup()系统调用生成文件描述符oldfd的一个副本,从未使用的文件描述符当中选取最小的文件描述符作为新的文件描述符。 当成功返回后,旧的文件描述符和新的文件描述符可以互换使用,这两个描述符指向了同一个打开的文件描述符(见系统调用open()),他们共享同一个文件偏移量和文件状态标志。比如说,当使用lseek操作某一个文件描述符,改变了该文件的偏移量的时候,使用另外一个描述符看到的是相同的偏移量。 这两个文件描述符不会共享文件描述符标志(例如 close-on-exe

q435201823的博客 1560

dup和dup2函数

dup和dup2函数 dup和dup2是两个非常有用的调用,他们的作用都是用来复制一个文件的描述符(使我们能够通过两个或者更多个不同的文件描述符来访问同一个文件),他们经常用来重定向进程的stdin、stdout和stderr。 声明如下: #include<unistd.h> int dup(int fd); 源描述符fd,返回值是描述符表中最小的文件描述符,返回的描述符和...

weixin_42904113的博客 2952

Linux应用编程之dup函数和dup2函数

在 Linux 系统中,open 返回得到的文件描述符 fd 可以进行复制,复制成功之后可以得到一个新文件描述符,使用新的文件描述符和旧的文件描述符都可以对文件进行 IO 操作,复制得到的文件描述符和旧的文件描述符拥有相同的权限,譬如使用旧的文件描述符对文件有读写权限,那么新的文件描述符同样也具 有读写权限;在 Linux 系统下,可以使用 dup 或 dup2 这两个系统调用对文件描述符进行复制。我们来学习下两个函数的用法以及它们之间的区别。 复制得到的文件描述符与旧的文件描述符都指向了同一个文件表,.

shengnan89的博客 3074

dup()/dup2()函数使用

dup()函数 函数功能: 复制文件描述符; 函数原型 int dup(int oldfd); oldfd --需要复制的文件描述符; 函数返回值 成功:返回最小且没有被占用的文件描述符; 失败:返回-1,设置error; //测试dup函数复制文件描述符 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #include <unistd.h

weixin_46211877的博客 346

dup()与dup2()的浅析

文章目录前言定义详解close then openopen - close - dup -closeopen - dup2 - close参考: 前言 关于dup()和dup2()的使用在Linux系统编程中是十分重要的一环,但关于dup2()的使用总有一种雾蒙蒙的感觉,本文会从dup()说起,希望可以带领大家走过迷雾 文中代码片中代码仅供逻辑参考 因本人水平有限,若文中有何纰漏,恳请各位斧正 定义 详解 dup()的使用与open(),close()函数的联系十分密切 思考一下,我们如何完

lin3ux的博客 766

[Linux]dup()与dup2()函数详解

dup()和dup2()是Unix/Linux系统中用于复制文件描述符的函数。示例代码展示了如何使用dup()和dup2()将标准输入或输出重定向到文件,从而实现数据的读写操作。

我的博客 590

实现dup2功能相同的函数

自行实现dup2的功能。函数原型:int mydup2(int fd, int fd2),思路如下: 1.fd2小于0,直接返回错误; 2.如果fd是有效的文件描述符且等于fd2,直接返回fd2; 3.如果fd2已经打开,关闭fd2; 4.分配一个长度为fd2值的fdset数组,不断调用dup,直到返回的文件描述符的值和fd2相等; 5.清理资源,返回fd2。 实现的函数代码如

lm2009200的博客 787

dup()函数

#include <stdio.h> #include<fcntl.h> #include<unistd.h> int main(int argc , char *argv[]) { if ( argc <2 ) { perror("error"); } int fd1, fd2; fd1 = ...

qq_42104065的博客 1545
上一篇: 线性表1.1
下一篇: GTK+第一课, 简单窗口创建
C_linux记事
博客等级 码龄14年 14粉丝 44原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值