在C语言中将文件内容重定向到另一个程序
制作一个基本的shell,我需要处理文件重定向。具体地说,我很难理解如何将数据输入到像在C语言中将文件内容重定向到另一个程序,c,shell,stdout,stdin,io-redirection,C,Shell,Stdout,Stdin,Io Redirection,制作一个基本的shell,我需要处理文件重定向。具体地说,我很难理解如何将数据输入到像sort这样的程序中,例如从文件中 命令行中的某些内容如下所示: $ sort < test.txt $sort
sort
这样的程序中,例如从文件中
命令行中的某些内容如下所示:
$ sort < test.txt
$sort
我如何在自己用C语言制作的迷你shell中实现这种功能
我想可能是从stdin
读取sort
,但我想由于只读的原因,我无法将文件的内容写入stdin
,所以我想知道如何将这些数据转换成类似sort
的东西?我目前正在使用forks,然后使用execvp()
执行程序。您需要使用
它的工作原理类似于fopen
。第一个参数是文件名,第二个参数是模式,第三个参数是指向重定向的文件指针。返回值是新文件指针。因此,如果要重定向stdin:
FILE *fp = freopen("input.txt", "r", stdin);
失败时它返回一个空指针,就像
fopen
shell打开文件(可能在子进程中),然后使用dup2()
进行安排,以便将文件连接到排序
进程的标准输入(并且关闭文件的原始文件描述符)。然后它运行排序(假设没有其他I/O重定向需要处理)。请记住适当地处理打开的错误(假设您已经处理了执行失败*())。关于自制shell中的I/O重定向,肯定有数百个问题。一种常见的方法是使用。在fork
之后和exec
之前,打开文件,然后dup2
其fd,其中STDIN\u FILENO
作为新fd。目标程序只需要从stdin读取,不需要知道它是来自文件还是来自终端输入。也许你可以尝试freopen()
?@kaylum从stdout重定向到文件(carrot向另一个方向),我一直在使用这个答案中的一些修改位:。我应该再做一次这样的事吗?