← 前一天目录后一天 →

每日科普 · 2026-10-16 周五

考研 408 × 求职面试

知识点 · Linux · 基础

输入输出重定向与管道

Linux 中,每个进程默认打开三个标准流:0 标准输入、1 标准输出、2 标准错误。重定向就是改变这些文件描述符的指向:> 覆盖写文件,>> 追加,< 从文件读,2> 重定向错误,2>&1 把错误并入标准输出。例如 echo hello > a.txt 把 hello 写入文件;wc -l < a.txt 把文件内容作为 wc 的输入。 管道 | 把前一个命令的标准输出接到后一个命令的标准输入,例如 ls | grep txt、ps aux | grep python。Shell 先创建管道和子进程,再用 dup2 把管道读/写端复制到 0/1,最后 exec 命令。因此管道通常只传 stdout,stderr 仍显示在终端;若需连同错误一起传,要写 2>&1 | ...。 核心记忆:重定向是“换插头”,管道是“接水管”。注意 > 前系统先清空文件,2>&1 的位置会影响结果,管道两端并发读写,缓冲区满或读端关闭需正确处理。

每日一题 · Linux

输入输出重定向与管道

执行命令 cmd > out.txt 2>&1 后,下列说法正确的是? A. 只有 stdout 写入 out.txt,stderr 仍到终端 B. stdout 和 stderr 都写入 out.txt C. stderr 写入 out.txt,stdout 仍到终端 D. stdout 和 stderr 都追加到 out.txt 末尾

解析

答案:B。Shell 从左到右处理重定向:先把 fd1 指向 out.txt,再让 fd2 复制 fd1,因此 stdout 和 stderr 都进入 out.txt。若写成 cmd 2>&1 > out.txt,fd2 先复制原来的 stdout(终端),随后 fd1 才改到文件,stderr 仍在终端。> 是覆盖而非追加,所以 D 错。关键考点是重定向顺序与文件描述符复制。

面试小贴士 · Linux

输入输出重定向与管道

面试常问 |、>、2>&1、/dev/null 及实现。答:重定向改 fd,管道用 pipe+dup2+exec,只连 stdout。易错:2>&1 顺序、>> 与 >、管道不传 stderr、SIGPIPE。

代码实现 · C

代码示例

#include <unistd.h>
#include <sys/wait.h>
#include <string.h>

int main(void) {
    int fd[2];
    pipe(fd);
    pid_t pid = fork();
    if (pid == 0) {
        // 子进程:stdin 重定向到管道读端,执行 wc -l
        dup2(fd[0], STDIN_FILENO);
        close(fd[0]);
        close(fd[1]);
        execlp("wc", "wc", "-l", NULL);
    } else {
        // 父进程:向管道写端写入两行
        close(fd[0]);
        const char *msg = "hello\nworld\n";
        write(fd[1], msg, strlen(msg));
        close(fd[1]);
        waitpid(pid, NULL, 0);
    }
    return 0;
}
← 前一天目录后一天 →