我的任务是编写一个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传递文本? 请给我一个将数据从shell中的stdin传递给文件的例子
答案 0 :(得分:1)
首先修复您的代码并将stdout
更改为1(或STDOUT_FILENO
)并将stdin
更改为0(或STDIN_FILENO
)。其他人是FILE *
,属于fread和fwrite。任何体面的编译器都应该警告你......
./MoveCommand < filename
是单向的。
这会将filename
的内容重定向到stdin
,然后将其写入文件“sss”,然后读取此文件并将内容回显到stdout
。< / p>
所以你基本上在做cat filename
,并且需要额外复制一些固定文件。
./Movecommand
本身也是可能的。但是你必须自己键入输入(此时为stdin
),并且当你想要发信号通知你输入Ctrl + D(Linux或Mac)或Ctrl + Z(Windows)时。然后它会回显您输入的所有内容,内容也在“sss”中。
当然,您也可以在管道中使用它,因此ls -l | ./Movecommand
例如{}试试吧。