以下是一个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后指向的是同一个文件了

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

 posted on 2024-09-24 13:11  Dylaris  阅读(42)  评论(0)    收藏  举报