以下是一个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