2016-05-29 39 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结束。 –

相关问题