当前位置: 首页 > 知识库问答 >
问题:

在外壳中重定向输入和输出

臧友樵
2023-03-14

嗨,我一直在用c编写shell,我在尝试重定向时卡住了。虽然在我的程序中重定向标准输出有效,但标准输入不起作用。

void redirect(node_t* node){
    // mode 0: >$%d mode 1: < mode 2: > mode 3: >>
    int input = 0;
    if(node->redirect.mode == 2){
        input = 1; // >
    } else{
        input = 0; // <
    }
    int pid = 0;
    int *status = 0;
    char * filename = node->redirect.target; // filename
    int fd;
    fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC);
    if((pid = fork()) == 0){
        dup2(fd, input); // STDIN OR STDOUT
        close(fd);
        node_t* node2 = node->redirect.child;
        execvp(node2->command.program, node2->command.argv); // execute program
        printf("failed to execvp\n");
        exit(1);        
    } else {
        wait(status);
    }
}

我是< code>fork()的新手,但我的问题是我在这里做错了什么,重定向stdout可以工作,但stdin不会向给定的文件写入任何内容。

共有1个答案

阎弘
2023-03-14

如注释中所述,您需要使用不同的打开选项,具体取决于您是打开文件进行输入还是输出重定向。如果,您可以将其放入中。

int flags;
if(node->redirect.mode == 2){
    input = 1; // >
    flags = O_WRONLY | O_CREAT | O_TRUNC;
} else{
    input = 0; // <
    flags = O_RDONLY;
}
int pid = 0;
int *status = 0;
char * filename = node->redirect.target; // filename
int fd;
fd = open(filename, flags, 0666);

此外,您需要为创建输出文件的情况指定权限模式。可以一直指定此参数,当O_CREAT不在标志中时,它将被忽略。

 类似资料:
  • 1. Shell 重定向 1.1 Shell 重定向是什么 我们在之前章节有学习 echo/printf 来将我们的需求输出,此时就是我们将系统的返回输出到我们标准终端,使得我们能够看到正常的输出的结果,Unix 命令默认的输入设备即 stdin 为键盘,标准和错误设备即 stdout 为显示器,我们利用重定向可以将输入改为文件,或者将输出重新定向到其他设备或文件中。 1.2 为什么要用重定向 我

  •   大多数 UNIX 系统命令从你的终端接受输入并将所产生的输出发送回​​到您的终端。一个命令通常从一个叫标准输入的地方读取输入,默认情况下,这恰好是你的终端。同样,一个命令通常将其输出写入到标准输出,默认情况下,这也是你的终端。 命令 说明 command > file 将输出重定向到 file。 command < file 将输入重定向到 file。 command >> file 将输出以

  • 本文向大家介绍linux shell数据重定向(输入重定向与输出重定向)详细分析,包括了linux shell数据重定向(输入重定向与输出重定向)详细分析的使用技巧和注意事项,需要的朋友参考一下 在了解重定向之前,我们先来看看linux 的文件描述符。 linux文件描述符:可以理解为linux跟踪打开文件,而分配的一个数字,这个数字有点类似c语言操作文件时候的句柄,通过句柄就可以实现文件的读写操

  • 问题内容: 我正在尝试使用C为Linux创建一个基本的shell。在我尝试进行输出重定向之前,它已经可以工作了,并且它破坏了一切。当我运行此代码时,它直接进入fork()的默认情况。我不知道为什么。如果我在子进程中摆脱了for循环,那么它就可以工作,但是即使有了for循环,我也不明白为什么子进程甚至从未输入。如果将打印语句放在子进程的顶部,则不会打印出来。 当我在命令行中运行此命令时,我得到提示并

  • 问题内容: 我正在尝试使用以下代码重定向在ProcessBuilder的帮助下启动的流程的输出 但是它以失败告终 线程“主”中的异常java.io.IOException:无法运行程序“ / myScript >> / myLogFile 2>&1 <&-&”:java.io.IOException:error = 2,java.lang中没有此类文件或目录.ProcessBuilder.star

  • 问题内容: 我想为服务器做一些简单的日志记录,这是一个在Docker容器中运行的小型Flask应用程序。 这是Dockerfile 正如您在最后一行看到的那样,我将stderr和stdout重定向到文件。现在我运行这个容器并将其装入其中 并注意以下几点: 服务器正在运行,网站正在运行 没有 产量: 但是没有日志…但是,如果我进入容器,则可以在控制台中看到该应用程序正在生成输出。 使用Docker时