2013-09-26 43 views
1

我已經實現了一個支持重定向的shell,但重新執行完成後,它獲得了我的shell。我怎樣才能以某種方式管理它以返回到shell(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 

能否請您給我如何解決它的一些提示嗎?

回答

0

先關閉手柄
然後調用AllocConsole在KERNEL32 /或在Win 7控制檯API ^創建控制檯

+0

你能解釋更多,希望有一段代碼嗎? –

+1

OP詢問有關POSIX C代碼,這個答案似乎與Windows有關。呼呼聲。 –

+0

here ... http://stackoverflow.com/questions/1908687/how-to-redirect-the-output-back-to-the-screen-after-freopenout-txt-a-stdo –

2

而不是在你的shell過程實際上轉化文件描述符,你想簡單節省的表示映射,然後在fork之後但在您執行exec命令之前執行替換。

+0

做I/O子進程中的重定向基本上是正確的。管道略有不同;它們必須在分叉之前創建,但重定向仍然在分叉之後完成。 –