您好我正在尝试在c中构建一个shell,而我仍然坚持使用i / o重定向部分。我必须支持多个重定向,例如“333sh:myprog< in_file> out_file”myprog从in_file获取输入,结果将被重定向到out_file,依此类推。你能给我一个起点吗?感谢
答案 0 :(得分:1)
因此,您正在编写的shell负责启动进程myprog
并以某种方式强制它从in_file
读取其输入并将其输出写入out_file
。
您要做的第一件事就是解析输入。这意味着在程序中以某种方式表示要启动的进程的名称,要读入的文件名以及要写入的文件名。这样做基本上需要对字符串myprog < in_file > out_file
进行标记,然后提供一些表示(如结构)来做什么。
如何实际实现重定向非常简单。要启动此流程,我猜你要去fork()
然后execvp
。要意识到的是,文件描述符是在forc中复制并在execvps中持久化的。
所以基本上在shell中,使用dup(2)
调用将STDIN_FILENO替换为input_file
的文件描述符,并将STDOUT_FILENO替换为output_file
的文件描述符。然后fork,然后execvp。在fork之后,在父进程(shell)中,您需要将STDOUT和STDIN文件描述符恢复为fork之前的内容,因此您需要以某种方式记住该信息。
答案 1 :(得分:0)
无论你有printf和scanf(或其他使用stdin / stdout的函数),只需用接收文件名参数的函数(fprintf / fscanf)替换它们,并在该文件参数中打开io重定向文件