7

現在、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);
}
4

2 に答える 2

0
/*  How shell works */
#include<stdio.h>

#include<unistd.h>

main (int argc, char **argv)
{

  if (argc < 2)
    {

      fprintf (stderr, "\nUsage: ./a.out cmd [options]...\n");

    }

  if (!fork ())
    {

      argv++;

      execvp (argv[0], argv);

    }

}
于 2015-05-10T10:54:34.363 に答える