2013-12-07 135 views
0

嗨,我想在c中建立一個殼,我卡在I/O重定向部分。我必須支持多重定向,例如「333sh:myprog < in_file> out_file」myprog正在從in_file獲取輸入,結果將被重定向到out_file等。你能給我一個出發點嗎?謝謝殼牌I/O重定向

回答

0

無論你有什麼printf和scanf(或其他功能與stdin /標準輸出一起工作),將它們替換爲接收文件名參數(fprintf/fscanf)的函數,並在該文件參數中放置io重定向文件打開它。

1

因此,您正在編寫的shell具有啓動進程myprog的工作,並以某種方式迫使其從in_file讀取輸入並將其輸出寫入out_file

您要做的第一件事就是解析輸入。這意味着在程序中代表你想要啓動的進程的名稱,讀入的文件名以及要寫入的文件名。這樣做基本上需要對字符串myprog <in_file> out_file進行標記,然後提出一些表示(如結構)來表示要做什麼。

如何實際實現重定向非常簡單。要啓動這個過程,我猜你會去fork(),然後execvp。要實現的事情是文件描述符跨叉複製並持續在execvps中。

所以基本上在外殼,使用dup(2)調用了文件描述符替換爲STDIN_FILENO和input_fileoutput_file文件描述符替換STDOUT_FILENO。然後fork,然後execvp。在fork之後,在父進程(shell)中,您需要將STDOUT和STDIN文件描述符恢復到fork之前的狀態,因此您需要以某種方式記住這些信息。

+0

+1但可能提及OP應該打開這些文件。 – Duck