2011-02-03 3 views
3

シンプルなシェルプログラムを作成しようとしていますが、組み込み以外のコマンドのファイルリダイレクトに問題があります。たとえば./a.out < infile> outfileの場合、ユーザがプログラムa.outをinfileから受け取って、通常は使用するストリームではなく出力をoutfileに出力します。ビルトインでないコマンドが出たとき、私は新しいプロセスをフォークし、指定された引数で新しいイメージをオーバーレイします。一般的な形式は、コマンドarg1 arg2 ... argn < infile> outfileです。 args(arg1〜argn)は新しいイメージに渡され、入力と出力はinfileとoutfileに変更されます。次に、私のフォークプロセスがどのように見えるかのスニペットを示します。シンプルシェルプログラムunix組み込みコマンド以外のファイルリダイレクト

pid = fork(); 

if (pid < 0) { 
    fprintf(stderr, "*** fork error ***\n"); 
} else if (pid == 0) { 
    execvp(command, args); 
} 

waitpid(pid, &status, 0); 

私はこれを行うことを可能にするUNIXコマンドはありますか?私はまた、新しいイメージの標準と標準出力を変更する方法があるかもしれないと考えていましたか?すべてのリンクや情報をいただければ幸いです。

+0

「フォークエラー」は有用なメッセージではありません。 perror()を使用してください。 –

答えて

2

Unixでは、一般的にこれにはdup2が必要です。ファイル記述子を複製するには、libc docsを参照してください。

2

execの直前のフォークされたプロセスでは、closeファイルは0(stdin)、1(stdout)、おそらくは2(stderr)を処理します。

次に、open()を使用して、必要なファイルを正しい順序(stdin、out、およびerr)で開きます。彼らはそれぞれファイルハンドルテーブルの最初のエントリ - 0,1,2を使用します。最初に開いたファイルは今からstdinとして扱われます。

関連する問題