我知道<?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
输出?
答案 0 :(得分:1)
两个程序同时运行。虽然管道左侧的过程是将输出写入管道,但管道右侧的过程正在从中读取。
tee
将在启动之后立即创建输出文件,然后再从输入中读取。这就是为什么你有时可以(!)在ls
的输出中看到dir
,和输出中的文件。但是,无保证。通常,它取决于每个进程何时进入/ CPU以及循环次数,tee
需要等待多长时间才能打开文件等等。
实际上,在我的测试系统中,该文件几乎总是出现在ls
或dir
。但有时,ls
或dir
再次列出了该文件中的文件。
答案 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
迟到了。