2016-05-29 44 views
-1

我的任務是寫一個C程序來說明mv命令使用系統調用:如何將數據從標準輸入傳遞給文件中的殼

#include<stdio.h> 
#include<errno.h> 
#include<stdlib.h> 
#include<unistd.h> 
#include<sys/types.h> 
#include<fcntl.h> 
#define BUF_SIZE 8192 
int main(){ 
int input_fd,output_fd; 
ssize_t ret_in, ret_out; //number of bytes returned by read(), write() 
char buffer[BUF_SIZE]; 
output_fd=open("sss", O_WRONLY | O_CREAT); 
if(output_fd==-1){ 
     perror("open"); 
     return 3; 
} 
while((ret_in=read(stdin, buffer, BUF_SIZE))>0){ 
     ret_out=write (output_fd, buffer,(ssize_t) ret_in); 
     if(ret_out!=ret_in){ 
       perror("write"); 
       return 4; 
     } 
} 
close(output_fd); 
input_fd=open("sss", O_RDONLY); 
while((ret_in=read(input_fd,buffer, BUF_SIZE))>0) 
     ret_out=write(stdout, buffer,(ssize_t) ret_in); 
close(input_fd); 
return 0; 
} 

如何在shell中運行的代碼,並將其傳遞來自stdin的文字? 請給我exapmle在外殼

+0

該代碼具有會導致意外行爲的問題。它是完整的源代碼嗎? –

+0

是的,但我把它從書中拿出來,可能有意的錯誤 – Stranger

+0

打開一個文件來編寫'O_CREAT'包括並不總是工作,如果你沒有權限,例如它會失敗,'open()'會返回'-1',然後你可以檢查'errno'來驗證原因。代碼不這樣做。另外,你究竟在期待什麼。這個問題並沒有解釋預期的行爲。 –

回答

1

從標準輸入傳遞數據到一個文件首先解決您的代碼,並改變stdout爲1(或STDOUT_FILENO)和stdin爲0(或STDIN_FILENO)的。其他的是FILE *,屬於fread和fwrite。任何體面的編譯器都應該在那裏警告你...

./MoveCommand < filename是一種方法。

這會將filename的內容重定向到stdin,並將其寫入文件「sss」,之後讀取該文件並將內容回顯至stdout

所以你在做cat filename本質上,與一些額外的副本到一些固定的文件。

./Movecommand本身也是可能的。但是你必須自己鍵入輸入(這是stdin),當你想表明你已經完成了Ctrl + D(Linux或Mac)或Ctrl + Z(Windows)。然後它會迴應你輸入的所有內容,並且內容也在「sss」中。

您也可以在管道中使用它,當然,例如ls -l | ./Movecommand嘗試一下。

+0

我試過./MoveCommand text.txt。結果是文件sss被創建,但其大小爲零。但是,text.txt的內容不是空的。另外我已經嘗試過./Movecommand,但是當我結束輸入並點擊輸入時,它說這樣的命令不存在。 – Stranger

+0

@Stranger你需要<,「小於」,text.txt,例如,從text.txt中讀取 –

+0

@Stranger ./Movecommand本身應該掛起,對吧?輸入文本(輸入不做任何特殊處理)並以Ctrl + D結束。 –

相關問題