1

リダイレクトをサポートするシェルを実装しましたが、リダイレクトが完了するとシェルから抜け出します。シェル (stdout) に戻るように管理するにはどうすればよいですか?

 int i;
     for (i=1; args[i];i++)
         {
           if (strcmp(args[i],">")==0)
             {
               printf("argv[i] %s %d \n", args[i], i);
               int out = open(args[i+1], O_WRONLY | O_TRUNC | O_CREAT, S_IRUSR | S_IRGRP | S_IWGRP | S_IWUSR);
               close(1);
               int fdl=dup2(out,1);
               close(out);
               execvp(args[0],args);
            //   open(STDOUT, ">>", \$out); //doesn't work~!
             }

         }

シェルを実行すると、次のようになります。

 ./basic_shell 
mysh> pwd > out_pwd
argv[i] > 1 
pwd: ignoring non-option arguments

期待どおりに out_pwd を作成し、pwd の結果を書き込みます。しかし、私が試してみると

mysh>ls > out_ls

次のエラーが表示されます。

ls cannot access >: No such file or directory

修正方法のヒントを教えてください。

4

2 に答える 2

2

シェル プロセスでファイル記述子を実際に変換する代わりに、単にマッピングの表現を保存し、コマンドのfork前後に子で置換を実行する必要がありますexec

于 2013-09-27T00:22:27.220 に答える
0

最初にハンドルを閉じて
から、kernel32 で AllocConsole を呼び出すか、win 7^ でコンソール API を呼び出してコンソールを作成します

于 2013-09-26T23:52:06.997 に答える