2012-12-10 156 views
-1

我編寫了這個代碼來覆蓋Ubuntu中的cat命令。 cat指令的以下三種格式正常工作,但休息不起作用。C中的標準輸入和輸出標準輸入和輸出

工作的:

  • ./catf> FILE.TXT
  • ./catf < FILE.TXT

不工作:

  • ./catf文件1。 txt> File.txt
  • ./catf File.txt

我正在向上面列出的程序發送終端參數。另一個問題是每個文件還包含Enter your String:也是它shouldn't.Here是代碼:

int main(int argc, char *argv[]) 
{ 
    int readbytes,fp; 
    char buf[1024]; 
    if(argc==1) 
    { 
     printf("Enter your String :\n\n"); 
     readbytes=read(STDIN_FILENO,buf,1024); 
     write(STDOUT_FILENO,buf,readbytes); 
    } 
    else if(argc==2) 
    { 
     fp=open(argv[1],O_RDONLY); 
     dup2(0,fp); 
     close(fp); 
     readbytes=read(STDIN_FILENO,buf,1024); 
     write(STDOUT_FILENO,buf,readbytes); 
    } 
    else if(argc==3) 
    { 
     if(argv[1][0]=='<') 
     { 
      fp=open(argv[2],O_WRONLY|O_CREAT,S_IRWXU); 
      dup2(1,fp); 
      close(fp); 
      readbytes=read(STDIN_FILENO,buf,1024); 
      write(STDOUT_FILENO,buf,readbytes); 
     } 
     else if(argv[1][0]=='>') 
     { 
      fp=open(argv[2],O_RDONLY); 
      dup2(1,fp); 
      close(fp); 
      readbytes=read(STDIN_FILENO,buf,1024); 
      write(STDOUT_FILENO,buf,readbytes); 
     } 
    } 
    else if(argc==4) 
    { 
     printf("inside"); 
     fp=open(argv[1],O_RDONLY); 
     dup2(0,fp); 
     close(fp); 
     fp=open(argv[3],O_WRONLY|O_CREAT,S_IRWXU); 
     dup2(1,fp); 
     close(fp); 
     readbytes=read(STDIN_FILENO,buf,1024); 
     printf("%c",buf); 
     write(STDOUT_FILENO,buf,readbytes); 
    } 
    return 0; 
} 

UPDATE:

我做的代碼由威廉建議的修改和的休息代碼工作正常,但這./catf File.txt ">" File2.txt仍然無法正常工作。這是爲什麼?

if(argc==4) 
    { 
     printf("inside4"); 
     fp=open(argv[1],O_RDONLY); 

     dup2(fp,0); 

     close(fp); 

     fp=open(argv[3],O_WRONLY|O_CREAT|O_TRUNC,S_IRWXU); 

     dup2(fp,1); 

     close(fp); 

     readbytes=read(STDIN_FILENO,buf,1024); 

     //printf("%c",buf); 

     write(STDOUT_FILENO,buf,readbytes); 
    } 

上述問題的原因是什麼?

回答

1

當您調用cat > file1.txt時,*argv[1]而不是<。相反,argc爲1,並且在調用main時已將stdout與該文件關聯。如果你想通過<經由外殼的說法,你將需要引用它:

$ cat '<' filename 

而且,你的dup2調用有逆轉的論據; STDOUT_FILENO應該是第二個參數,而不是第一個參數。你在argc==2條款中的方式是關閉fp並將其重新打開到原始標準輸出。

+0

查看我更新的問題 – Alfred

+0

更改可執行文件的名稱不會以任何重要的方式改變我的答案。唯一的區別是我的例子應該是'./catf'<'filename'。在運行程序方面,現在'* argv [0]'是'catf'而不是'cat',但是'argc'仍然是1,而'* argv [1]'仍然是NULL而不是'<你在你的問題中調用該命令。 –

+0

好的。爲什麼'Not Working'下列出的那些不起作用? – Alfred

0

正如@William Pursell所說,重定向由shell處理,而不是由程序處理。所以程序永遠不會看到argv[]中的重定向符號。

但是,您可以告訴您是否已通過測試isatty(fd)重定向。不幸的是,你不能以任何標準的方式知道你被重定向到哪個文件,例如你可能被重定向到/來自管道。

Linux上有可能的黑客攻擊,您可以閱讀/proc/$$/fd(其中$$是您當前的PID)並查看fds 0,1,2的符號鏈接。儘管這在所有UNIX上都不受支持。

相關問題