关于ls,dir和tee的混乱

时间:2016-01-19 12:20:29

标签: linux bash ls dir tee

我知道<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:background="#A6000000" android:layout_height="match_parent"> <gmaillogindemo.com.irk.transforms.VerticalViewPager android:id="@+id/vertical_viewpager" android:layout_width="match_parent" android:layout_height="match_parent" /> 将从STDIN读取并创建一个新文件。但是当tee出现时,首先会发生哪个过程?

例如:

ls

但涉及到➤ ls 12 123 1234 ➤ ls | tee hello 12 123 1234 hello # ls catch hello ➤ ls | tee 000 12 123 1234 hello # ls didn't get 000 ➤ ls | tee 0 000 12 123 1234 hello # ls didn't get 0 ➤ ls | tee 00000 0 000 00000 # ls did get 00000 12 123 1234 hello ➤

dir

为什么?哪个先发生? ➤ ls 12 123 1234 ➤ dir | tee hello 12 123 1234 hello # get hello ➤ dir | tee 000 000 12 123 1234 hello ➤ dir | tee 0 0 000 12 123 1234 hello #get 0 ➤ dir | tee 000000 0 000 12 123 1234 hello # didn't get 00000 ➤ dir | tee 01 0 000 000000 01 12 123 1234 hello ➤ dir | tee 000000000000000000000000 0 000 000000 000000000000000000000000 01 12 123 1234 hello #get 00000000..000 ➤ 创建新文件或tee / ls输出?

2 个答案:

答案 0 :(得分:1)

两个程序同时运行。虽然管道左侧的过程是将输出写入管道,但管道右侧的过程正在从中读取。

tee将在启动之后立即创建输出文件,然后再从输入中读取。这就是为什么你有时可以(!)在ls的输出中看到dir输出中的文件。但是,无保证。通常,它取决于每个进程何时进入/ CPU以及循环次数,tee需要等待多长时间才能打开文件等等。

实际上,在我的测试系统中,该文件几乎总是出现在lsdir。但有时,lsdir再次列出了该文件中的文件。

答案 1 :(得分:1)

这实际上是 directory-resource process-race-condition 的情况,因为这两个进程是并行执行的。

  

管道中的每个命令都作为一个单独的进程执行(即,在   一个子壳)。

管道的想法是,与可执行文件 exec_A 关联的流程 A 中的output被重定向到处理与可执行文件相关联的 B exec_B

exec_A | exec_B

如何完成这项工作主要取决于实现,但考虑到实际的限制,操作系统必须创建一个缓冲区来放置 A 的输出并强制 B 来读取那个缓冲区。这是在流程开始之前发生的。

所发生的事情就像:

exec_A &> buf ; exec_B < buf &

流程在内部对接收或写入的数据执行的操作取决于流程的实现。在这种情况下,tee正在创建将在进程启动时写入的文件,这绝对是逻辑的,因为它需要附加传入数据。

鉴于此,它取决于进程A(即ls / dir)是否在进程B打开文件之前完成其目录横向。这实际上取决于谁获得资源的父级锁定。

您实际上可以观察到ls几乎总是输出这样创建的资源:

ls * | tee subdir/0

因为它在subdir迟到了。