【问题标题】:How to pass data to a file from stdin in the shell如何将数据从 shell 中的标准输入传递到文件
【发布时间】:2016-05-29 14:12:06
【问题描述】:

我的任务是编写一个 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 中运行该代码并从标准输入传递文本? 请给我从 shell 中的标准输入向文件传递数据的例子

【问题讨论】:

  • 代码存在会导致意外行为的问题。它是完整的来源吗?
  • 是的,但我是从书上拿来的,可能会故意出错
  • 打开一个文件写入O_CREAT包含并不总是有效,如果你没有权限,例如它会失败,open()会返回-1然后你可以检查@987654326 @ 验证原因。代码不这样做。另外,你到底在期待什么。该问题没有解释预期的行为。
  • How to Ask。如果您从一本书中复制,您自己对代码的贡献在哪里?您的具体问题是什么?此外,这似乎是一本糟糕的书,因为它使用了已弃用的 main 签名。并且mv 不会在同一个文件系统中复制文件。
  • 这就是问题所在。我们很乐意提供帮助,但如何运行代码的答案在您发布的代码中非常清楚。如果您要问这个问题,那么它会告诉所有人您不了解代码的作用,因此它极不可能是您的工作产品。请花点时间查看每一行代码在做什么。阅读每个调用的手册页。然后,如果您仍然卡住。询问您遇到的具体问题,该问题比“我如何运行此代码”要窄得多。

标签: c shell stdin


【解决方案1】:

首先修复您的代码并将stdout 更改为1(或STDOUT_FILENO)并将stdin 更改为0(或STDIN_FILENO)。其他的是FILE *,属于fread和fwrite。任何体面的编译器都应该在那里警告你...

./MoveCommand &lt; filename 是一种方式。

这会将filename的内容重定向到stdin,并将其写入文件“sss”,然后读取该文件并将内容回显到stdout

所以你实际上是在做cat filename,对某个固定文件有一个额外的副本。

./Movecommand 本身也是可能的。但是你必须自己输入输入(此时是stdin),当你想发出信号时,你已经完成了 Ctrl+D(Linux 或 Mac)或 Ctrl+Z(Windows)。然后它会将您输入的所有内容回显给您,并且内容也在“sss”中。

当然,您也可以在管道中使用它,例如 ls -l | ./Movecommand试试看。

【讨论】:

  • 我试过 ./MoveCommand text.txt。结果是创建了文件 sss 但它的大小为零。但是,text.txt 的内容不为空。我也尝试过 ./Movecommand 本身,但是当我结束输入并点击输入时,据说这样的命令不存在。
  • @Stranger 你需要
  • @Stranger ./Movecommand 本身应该挂起,对吗?输入文本(输入没有什么特别的)并以 Ctrl+D 结束。
  • Henno Brandsma,对不起,我的意思是我使用了 ./MoveCommand
  • @Stranger 发现另一个错误:更改 stdin --> 0 和 stdout --> 1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-09
  • 2011-11-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多