在C语言中将文件内容重定向到另一个程序

在C语言中将文件内容重定向到另一个程序,c,shell,stdout,stdin,io-redirection,C,Shell,Stdout,Stdin,Io Redirection,制作一个基本的shell,我需要处理文件重定向。具体地说,我很难理解如何将数据输入到像sort这样的程序中,例如从文件中 命令行中的某些内容如下所示: $ sort < test.txt $sort

制作一个基本的shell,我需要处理文件重定向。具体地说,我很难理解如何将数据输入到像
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向另一个方向),我一直在使用这个答案中的一些修改位:。我应该再做一次这样的事吗?