現在、C でシェルを実装しています。次のようなコマンドを実行しようとすると、問題が発生します。
SHELL$: sort < txtFile | grep key
プロセス(子)で実行sort < txtFile
され、親で実行されています。つまりelse if(pid > 0)
、パイプの右側で他のコマンドを実行しています。
プログラムは正常に実行されますが、ユーザーからの入力を受信し続けるためにメインで設定した無限ループを終了します。
どうすればこの問題を解決できますか?
これは、パイプを処理するためにこれまでに持っているコードです。リダイレクトを処理する必要があるコードは含めませんでした:
c2p は、このためにセットアップされたパイプです。
if(pid == 0)
{
if( PIPE_FLAG )
{
close(c2p[0]);
if(dup2(c2p[1], STDOUT_FILENO) == -1){
perror("dup2() failed");
exit(2);
}
}
/* Execute command */
execvp(cmd_args[0], cmd_args);
perror("exec failed 1. "); /* return only when exec fails */
exit(-1);
}
else if(pid > 0)
{
if(PIPE_FLAG)
{
close(c2p[1]);
if(dup2(c2p[0], STDIN_FILENO) == -1){
perror("dup2() failed");
exit(-1);
}
execvp(nxt_args[0], nxt_args);
perror("exec failed 2. ");
exit(-1);
}
}
else
{
/* error occurred */
perror("fork failed");
exit(1);
}