Linux 1.文件编程(dup、dup2)

重定向

  • 重定向是什么?
  • dup
  • dup2

重定向是什么?

进程在最开始运行的时候,首先打开了三个文件,分别是标准输入流、标准输出流、标准错误输出流。证明的时候我是把标准输出留给关闭了,然后紧接着创建的文件就会占用已关闭的标准输出流,使得本该流向显示器的数据流向了新创建的文件。先不谈底层的原理,就只看表象,就像是使数据流的方向从一个方向,指向了另一个方向,完成了数据流的方向重定向。现在再次理解重定向就好理解得多了:重新锚定方向
————————————————

                        版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/qq_63412763/article/details/127732577

dup

#include <unistd.h>int dup(int fd);
int dup2(int fd1,int fd2);

两个均为复制一个现存的文件的描述。

两个函数的返回:若成功为新的文件描述,若出错为-1;

由dup返回的新文件描述符一定是当前可用文件描述中的最小数值。用dup2则可以用fd2参数指定新的描述符数值。如果fd2已经打开,则先关闭。若fd1=fd2,则dup2返回fd2,而不关闭它。通常使用这两个系统调用来重定向一个打开的文件描述符。

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>/** ./dup 1.txt* argc    = 2* argv[0] = "./dup"* argv[1] = "file"* ...*/int main(int argc, char **argv)
{char buf[10];char buf2[10];if (argc != 2){printf("Usage: %s <file>\n", argv[0]);return -1;}int fd = open(argv[1], O_RDONLY);int fd2 = open(argv[1], O_RDONLY);int fd3 = dup(fd);printf("fd = %d\n", fd);printf("fd2 = %d\n", fd2);printf("fd3 = %d\n", fd3);if (fd < 0 || fd2 < 0 || fd3 < 0){printf("can not open %s\n", argv[1]);return -1;}read(fd, buf, 1);read(fd2, buf2, 1);printf("data get from fd : %c\n", buf[0]);printf("data get from fd2: %c\n", buf2[0]);read(fd3, buf, 1);printf("data get from fd3: %c\n", buf[0]);return 0;
}

在这里插入图片描述

dup2

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>/** ./dup2 1.txt* argc    = 2* argv[0] = "./dup2"* argv[1] = "file"* ...
*/int main(int argc,char **argv)
{int fd = 0;if(argc < 2){printf("Usage:%s <file>\n",argv[0]);return -1;}fd = open(argv[1],O_RDWR | O_CREAT | O_TRUNC,0666);if(fd < 0){printf("Can not open %s!\n",argv[1]);printf("errno = %d\n",errno);printf("%s\n",strerror(errno));return -1;}else{printf("fd = %d\n",fd);}dup2(fd,1);printf("hello,world\n");return 0;
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/817575.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JavaScript-2.对话框、函数、数组、Date、DOM

对话框 window对象封装了三个对话框用于与用户交互 提示框&#xff1a;alert(title);确认框&#xff1a;confirm(title);输入框&#xff1a;prompt(title); 确认框 包含两个按钮“确认”/“取消”&#xff0c;点击确定时&#xff0c;返回值为true // 确认框 var bool con…

Linux系统编程---文件系统

一、文件存储 一个文件主要由两部分组成&#xff0c;dentry(目录项)和inode inode本质是结构体&#xff0c;存储文件的属性信息&#xff0c;如&#xff1a;权限、类型、大小、时间、用户、盘块位置… 也叫做文件属性管理结构&#xff0c;大多数的inode都存储在磁盘上。 少量…

XWX-SX三箱社交箱

简单介绍&#xff1a; 动物行为学是一门研究动物行为的科学&#xff0c;它包括观察动物在自然环境中的行为&#xff0c;以及在控制环境中的实验行为。三箱社交实验是其中一种常见的实验方法&#xff0c;用于评估动物的社交行为和决策制定能力。这种实验在许多领域都有应用&…

bugku-web-需要管理员

页面源码 <html> <head> <meta http-equiv"Content-Type" content"text/html; charsetUTF-8"> <title>404 Not Found</title> </head> <body> <div idmain><i> <h2>Something error:</h2…

QT、ffmpeg视频监控分屏

1、支持分屏&#xff08;4&#xff0c;6&#xff0c;8&#xff0c;9&#xff0c;13&#xff0c;16&#xff0c;25&#xff0c;32&#xff0c;64&#xff09;切换 2、支持拖拽效果 3、支持播放mp4&#xff0c;rtmp等 4、本人亲测支持播放32路&#xff0c;64路没做测试 5、支持读…

【C++成长记】C++入门 | 类和对象(中) |类的6个默认成员函数、构造函数、析构函数

&#x1f40c;博主主页&#xff1a;&#x1f40c;​倔强的大蜗牛&#x1f40c;​ &#x1f4da;专栏分类&#xff1a;C❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 目录 一、类的6个默认成员函数 二、构造函数 1、概念 2、特性 三、析构函数 1、概念 2、特性 一、…

R语言计算:t分布及t检验

t分布理论基础 t分布也称Student’s t-distribution&#xff0c;主要出现在小样本统计推断中&#xff0c;特别是当样本量较小且总体标准差未知时&#xff0c;用于估计正态分布的均值。其定义基于正态分布和 X 2 X^{2} X2分布&#xff08;卡方分布&#xff09;。如果随机变量X服…

springCloudAlibaba集成seata实战(分布式事物详解)

一、分布式事务 1. 事务介绍 1.1 基础概念 事务&#xff1a;保证我们多个数据库操作的原子性&#xff0c;多个操作要么都成功要么都不成功 事务ACID原则 A&#xff08;Atomic&#xff09;原子性&#xff1a;构成事务的所有操作&#xff0c;要么都执行完成&#xff0c;要么全部…

三次握手与四次挥手到底是怎么回事?

三次握手和四次挥手是TCP/IP协议中建立和断开连接的关键步骤&#xff0c;它们是保证可靠通信的重要机制。这里将探讨这两个概念&#xff0c;并解释它们背后的原理。 三次握手 三次握手用于建立TCP连接&#xff0c;它由客户端和服务器之间发送的三个报文组成&#xff1a; 第一次…

市场份额第一:SmartX 领跑 23全年中国超融合软件市场

日前&#xff0c;IDC 发布《中国软件定义存储&#xff08;SDS&#xff09;及超融合存储系统&#xff08;HCI&#xff09;市场季度跟踪报告&#xff0c;2023 年第四季度》&#xff0c;详解中国区超融合发展趋势、市场份额规模以及厂商占比。 IDC 数据显示&#xff0c;2023 年全…

rust使用print控制台打印输出五颜六色的彩色红色字体

想要在控制台打印输出彩色的字体&#xff0c;可以使用一些已经封装好的依赖库&#xff0c;比如ansi_term这个依赖库&#xff0c;官方依赖库地址&#xff1a;https://crates.io/crates/ansi_term 安装依赖&#xff1a; cargo add ansi_term 或者在Cargo.toml文件中加入&#…

带洞平面三角分割结果的逆向算法

先标不重复点&#xff0c;按最近逐个插入。 只说原理。 不带洞的 1 2 4 2 3 4 两个三角形 结果 1 2 3 4 无重复 无洞 1 2 6 1 2 3 6 1 2 3 7 6 1 2 3 4 7 6 1 2 3 4 5 7 6 1 2 3 4 1 5 7 6 1 2 3 4 1 6 5 7 6 最终结果 1 2 3 4 1 6 5 7 6 按重复分割 1 2 3…

自定义滚动条样式:前端实现跨浏览器兼容

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

【mac】【python】新建项目虚拟环境后,使用命令pip出现错误:zsh: command not found: pip

【mac】【python】新建项目虚拟环境后&#xff0c;使用命令pip出现错误&#xff1a;zsh: command not found: pip 问题描述&#xff1a; 拉取或者创建新的python项目时&#xff0c;为项目添加了新的解释器&#xff0c;创建啦虚拟环境&#xff0c;但是执行pip命令的时候找不到命…

LeetCode 面试经典150题 202.快乐数

题目&#xff1a; 编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为&#xff1a; 对于一个正整数&#xff0c;每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个数变为 1&#xff0c;也可能是 无限循环 但始终变不到 1。如果这个过程 结…

《前端面试题》- JS基础 - 伪数组

第一次听说伪数组这个概念&#xff0c;听到的时候还以为是说CSS的伪类呢&#xff0c;网上一查&#xff0c;这东西原来还是个很常见的家伙。 何为伪数组 伪数组有两个特点&#xff1a; 具有length属性&#xff0c;其他属性&#xff08;索引&#xff09;为非负整数但是却不具备…

C ++ 和 C语言的优缺点分别是什么?

C语言&#xff0c;它简直就是编程世界的一块磐石。简洁、直接&#xff0c;让人一眼就能明白它想干嘛。它的运行速度快&#xff0c;接近硬件操作&#xff0c;特别适合那些需要直接与硬件打交道的场景。但就是因为这种接近硬件的特性&#xff0c;C语言在抽象层次上就显得有点捉襟…

【MCU开发规范】:MCU的性能测试

MCU的性能测试 前序性能评判方法MIPSCoreMark EEMBC其他参考 前序 我们平时做MCU开发时&#xff0c;前期硬件选型&#xff08;选那颗MCU&#xff09;基本由硬件工程师和架构决定&#xff0c;到软件开发时只是被动的开发一些具体功能&#xff0c;因此很少参与MCU的选型。 大部分…

linux(ub)-redis环境部署

1.下载redis包 wget http://download.redis.io/releases/redis-7.0.5.tar.gz 2.解压缩&#xff1a; tar -zxvf redis-7.0.5.tar.gz 3.安装gcc&#xff1a;sudo apt-get install gcc 4. 编译&#xff1a;cd redis-7.0.5 make make make install 5. cd /usr/local/bin/ 6. mkdir …

SSL证书和IP证书的区别

SSL证书是一种用于保障网络传输安全的数字证书&#xff0c;它通过为网站提供加密服务&#xff0c;确保用户与网站之间交换的数据不被第三方截取或篡改。IP证书是一种用于验证和保护IP地址的数字证书。它是通过将IP地址与其所有者的身份信息相联系&#xff0c;从而确保IP地址的真…