即时重定向输出 - 在 Linux 中看起来不可能,为什么?

Mar*_*sha 2 linux history proc

我尝试过网络搜索,但没有通过即时搜索 Linux 重定向输出找到答案。据我了解,输出说 stdout 工作通过使用文件描述符 1:

$ ls -l /proc/pid/fd/1
lrwx------ 1 user1 user1 64 Sep 27 13:37 1 -> /dev/pts/1
Run Code Online (Sandbox Code Playgroud)

有一些与proc文件系统一起工作的 Unix 命令,例如ls在这里,tee可以写入文件,cat可以读取。为什么对于例如 Linux 没有实现用户可以通过ln -sin手动更改这些链接bash?(当我尝试时出现错误"No such file or directory")。实施起来会不会很困难?那个实用程序proc的程序员是如何决定应该使用什么实用程序的?

dir*_*rkt 10

为什么对于例如 Linux,它没有实现用户可以通过 ln -s 在 bash 中手动更改这些链接?

因为proc文件系统只显示内部内核状态。在某些情况下,您实际上可以通过将内容写入特定文件来影响内核状态,但我想不出一个可以移动内容的示例。

实施起来会不会很困难?

内核是开源的,请自行查看并决定(“难”与您的编程经验有关)。

还要考虑如果您正在修改的进程正在向标准输出写入内容时会发生什么。还要考虑安全隐患。

然而,在我看来,在上游内核中进行这种修改的可能性可能很低。

它是如何决定哪个实用程序应该与 proc 一起工作的——由那个实用程序的程序员来决定?

/proc是一个虚拟文件系统,因此实现了虚拟文件系统所需的内核功能。当各种内核程序员使用 时/proc,他们通常会尝试以最不费力的方式进行编程。


Emm*_*osa 6

在 Linux 上,标准输入/输出文件描述符是通过内核系统调用创建的,而不是通过/proc文件系统。

您在其中看到的符号链接/proc不是用于管道数据的实际方法,而是反映内核正在做什么以允许进程访问数据。这就是为什么你不能ln -s用来改变它们。

关于动态重定向输出的问题,我不知道有什么命令可以做到这一点。但这当然是可能的。以下是如何开发此类程序的示例:

  1. 首先,从实现cat. 因此,采用标准输入并将其转储到标准输出。这将是一个非交互式应用程序。
  2. 接下来,更改程序以使其具有交互性。一个简单的例子是传输少量输入并等待用户按 ENTER。然后再传输一点输入,并重复。在这个阶段,程序能够暂停并做出决定,这对于能够即时重定向输出非常重要。
  3. 最后,修改程序,以便能够接受指定输入和输出应该是什么的命令。它可能是一个带有 API、NCURSES UI 等的守护进程。

以上当然说起来容易做起来难。我掩盖了很多重要的细节,但我认为这足以表明动态重定向输出至少是可行的。

  • 您还可以附加(使用 ptrace() )一个调试器,让应用程序在没有真正注意到它的情况下更改其输出。例如来自 SO:[使用命令行在进程启动后重定向 STDERR/STDOUT?](/sf/ask/41560711/ -been-started-using-command-lin/3834605#3834605) (6认同)

Eri*_*ikF 5

您可以创建一个伪终端(PTY)并通过它重定向输入和输出,而不是改变 stdin 等指向的位置,这样程序就不必知道任何事情已经改变:事实上,有几个程序就是这样做的(通常称为终端多路复用器。)

正如您可能知道的那样,您可以从一个终端上的会话断开连接,然后使用像 一样的多路复用器在其他地方重新连接到它tmux,但您也可以随时通过管道传输标准输入或输出。例如,如果我在tmux窗格内运行一个 shell并将命令pipe-pane 'cat >>~/test.txt'(取自手册页)发送到tmux,则标准输出现在将被附加到,~/test.txt而不会更改会话窗格内的任何内容。