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

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

时间:2024-09-24 13:12:27浏览次数:16  
标签: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命令详解】
    文章目录一、命令概述二、基本语法三、工作原理四、示例五、注意事项......
  • [redis命令]字符串命令
    命令表命令含义SET设置指定key的值GET获取指定key的值GETRANGE返回key中字符串值的子字符GETSET将给定key的值设为value,并返回key的旧值(oldvalue)GETBIT对key所储存的字符串值,获取指定偏移量上的位(bit)MGET获取所有(一个或多个)给定key的值SETBIT......
  • 一行命令,一分钟轻松搞定SSL证书自动续期
    httpsok是一个便捷的HTTPS证书自动续签工具,专为Nginx服务器设计。已服务众多中小企业,稳定、安全、可靠。现在的网站SSL免费证书有效期只有3个月,所以就会有经常更快SSL证书的需求,如果手上需要更换的SSL证书比较多的情况下,那么这将是一个比较繁琐的过程,首先需要挨个去申......