首页 > 其他分享 >使用dup2实现一个简单的命令重定向

使用dup2实现一个简单的命令重定向

时间:2024-09-24 13:12:27浏览次数:10  
标签:FILENO 重定向 dup2 STDOUT argv 命令 fd

以下是一个echo命令的的重定向的简单实现,大家可以把他改成main函数在执行,一样的,然后我们需要关注的部分就是代码中标有注释的代码块

#include "command.h"

int _echo(char *argv[])
{
	int argc = 0;
	for (char **ptr = argv; *ptr != NULL; ptr++)
		argc++;

	if (argc < 2 || argc > 4 || (argc == 4 && strcmp(argv[2], ">") != 0)) {
		fprintf(stderr, "Usage: echo string [ > file ]\n");
		return -1;
	}

	if (argc == 4) {
        /* 使用dup2实现命令重定向 */
		const char *file = argv[3];
		int fd = open(file, O_CREAT | O_WRONLY | O_APPEND, 0644);
		if (fd == -1) {
			fprintf(stderr, "echo error: open\n");
			return -1;
		}

		dup2(fd, STDOUT_FILENO);
		close(fd);
        /* 使用dup2实现命令重定向 */
	}

	printf("%s\n", argv[1]);
	return 0;
}

我们把这个关键部分截取出来,首先dup2函数之前就是打开重定向目的地的文件啦,我们用fd来表示这个文件,然后使用dup2(fd, STDOUT_FILENO);来将标准输出重定向到该文件,换句话说,原本会输出到屏幕上的内容(一般是标准输出),现在会被输出到该文件中,这个就是重定向了

        /* 使用dup2实现命令重定向 */
	const char *file = argv[3];
	int fd = open(file, O_CREAT | O_WRONLY | O_APPEND, 0644);
	if (fd == -1) {
		fprintf(stderr, "echo error: open\n");
		return -1;
	}

	dup2(fd, STDOUT_FILENO);
	close(fd);
       /* 使用dup2实现命令重定向 */

然后再剖析下dup2(fd, STDOUT_FILENO);,大家先去了解了解dup2的原型和用法,简单来说它就是用来复制文件描述符的,不过它对于参数有一个特别的操作,就是如果newfd存在,那就会将它关闭,然后再复制,所以这里的newfd是STDOUT_FILENO,指代的是标准输出,现在我将标准输出关闭,然后复制为fd,即重定向到fd,那么对于STDOUT_FILENO的任何操作都是对fd代表的文件的操作,因为二者经过dup2后指向的是同一个文件了

这样就实现了重定向的功能了

标签:FILENO,重定向,dup2,STDOUT,argv,命令,fd
From: https://www.cnblogs.com/dylaris/p/18428928

相关文章

  • Linux col命令
    col命令在Linux系统中用于过滤反向线(^H,即控制字符的第8个,也称为退格符)和其他控制字符,通常与nl命令结合使用来显示格式化的文本文件。基本语法col[选项]常用选项-b或--noback:不过滤退格符。-p或--showctrl:显示控制字符(如^H)。-x或--spaces:将水平制表符转换为空格。示......
  • 【ldd命令详解】
    文章目录一、命令概述二、基本语法三、工作原理四、示例五、注意事项......
  • Docker常用命令
    背景描述    A平台实现了通过xen运行dom0,domU。移植B平台时因为运行环境差异程序无法运行,再加上一些下载权限的限制,从而引入Docker,需要将Xen运行Dom0和DomU的环境统一在Dockerfile中配置完成,创建Docker容器所需要的Image会依据Dockerfile的配置生成。以下为目前本人......
  • Windows命令:时间延迟命令
    延迟一段时间再执行下一条命令”。一、利用ping实现延迟命令这种延时手段是不精确的,因为每一次ping通的延迟不一样。1、示例chcp65001@echooffecho延时前:%time%ping/n3127.0.0.1>nulecho延时后:%time%pause参数/n表示ping通的次数。127.0.0.1是本机ip地址,在这......
  • [redis命令]字符串命令
    命令表命令含义SET设置指定key的值GET获取指定key的值GETRANGE返回key中字符串值的子字符GETSET将给定key的值设为value,并返回key的旧值(oldvalue)GETBIT对key所储存的字符串值,获取指定偏移量上的位(bit)MGET获取所有(一个或多个)给定key的值SETBIT......
  • Linux常用命令
    在Linux系统中,有许多常用的命令用于日常操作、文件管理、系统监控、网络管理等。以下是一些常用的Linux命令以及它们的简单说明:1.文件和目录管理ls:列出目录内容ls#列出当前目录的文件和文件夹ls-l#列出文件的详细信息ls-a#列出......
  • 如何使用Docker进入容器并运行命令
    在Docker的日常管理和应用开发过程中,经常会遇到需要与容器内部进行交互的情况。无论是调试应用程序还是检查服务状态,能够有效地进入容器内部执行命令都是非常必要的。本文将详细介绍如何通过Docker命令行工具进入一个正在运行的容器,并在其中执行各种命令。Docker简介Docker是......
  • 2024.9.23docker常用命令
    1.容器管理查看运行中的容器:dockerps查看所有容器(包括已停止的):dockerps-a启动容器:dockerstart<container_id或container_name>停止容器:dockerstop<container_id或container_name>重启容器:dockerrestart<container_id或container_name>删除......
  • 一行命令,一分钟轻松搞定SSL证书自动续期
    httpsok是一个便捷的HTTPS证书自动续签工具,专为Nginx服务器设计。已服务众多中小企业,稳定、安全、可靠。现在的网站SSL免费证书有效期只有3个月,所以就会有经常更快SSL证书的需求,如果手上需要更换的SSL证书比较多的情况下,那么这将是一个比较繁琐的过程,首先需要挨个去申......
  • vim 命令失效解决方法 输入命令无反应
     环境是centos7x86 vim显示最新版which命令vim也是有的如题命令都是有的但是无返回结果1.卸载重装yumremovevim-y2.安装yuminstallvim-y3.执行vim 报错撸提示缺库依赖搜索了一下该软件是哪个包提供的yumprovides*libgpm.so.2yum参数-h:显示......