寫入從未開啟的檔案描述符的資料去了哪裡

寫入從未開啟的檔案描述符的資料去了哪裡

我透過以下命令捕獲了輸出:

$ strace -f -e trace=process,socketpair,open,close,dup,dup2,read,write -o rsync.log rsync -avcz --progress src/ dst/

有點長所以我上傳了這裡。現在我想對這個文件做一些分析。

以下輸出顯示使用clone系統呼叫產生的進程/執行緒:

# SPAWNED PROCESSES/THREADS
$ grep 'clone(' rsync.log | awk '{print $1 " -> " $NF}'
1399 -> 1400
1400 -> 1401

以下輸出顯示大多數情況下資料是writen 到帶有 number 的檔案描述符4

# PID, FD, NO OF CALLING WRITE SYSCALL
$ cat <(grep 'write(' rsync.log | egrep -v 'unfinished|resumed') <(paste <(grep write rsync.log | grep unfinished) <(grep write rsync.log | grep resumed)) | cut -d',' -f1 | sed 's%write(%%' | awk '{a[$0]++}END{print "PID  FD COUNT"; for(i in a){print i " " a[i]}}'
PID  FD COUNT
1399  4 1622
1400  1 7
1401  3 307
1401  4 7
1399  1 15

以下輸出顯示4描述符從未使用open系統呼叫開啟(1 是 STDOUT,所以我假設不需要開啟此 FD):

# LIST OF FILE DESCRIPTORS THAT WAS OPEN
$ grep 'open(' rsync.log | awk 'BEGIN {FS=" = "} {print $NF}' | grep '^[0-9]\+$' | sort | uniq
0
3
6

兩個問題:

I. 如果4描述符沒有被open編輯,這些資料會去哪裡,怎麼可能rsync如預期般運作?

$ grep 'write(4' rsync.log | head
1399  write(4, "\37\0\0\0", 4 <unfinished ...>
1399  write(4, "I\0\0\7\5(\1.\0\0\0W}%i\360\220\261\177\21\370A\0\0\0\203\347\6vbox"..., 77 <unfinished ...>
1401  write(4, "\4\0\0\7\376\377\377\377", 8) = 8
1399  write(4, "\177\301\0\7\3\n\200\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\177\377\354\226C\214.\0\260"..., 49539) = 49539
1399  write(4, "\2\301\0\7\177\377a\353\35\2433\1\332m\301\330\266\315\216\3557\352\330\266m\333\366\33\333\266;v"..., 49414) = 49414
1399  write(4, "\21\302\0\7\177\377\236mTNG\356\304\376u\237\214\275\310\300*\317\264\221W\372\340\307\36\345%\330"..., 49685 <unfinished ...>
1399  write(4, "\360\300\0\7\177\377\27W\357\24$\f\23,\v\216\355\371\306\266m\333\266m\333\266m\333\266m\333\266"..., 49396 <unfinished ...>
1399  write(4, "\223\301\0\7\177\377D\214# D\304\2\25xA\fY\310U\201Q*e\25\235\20\213\v\320~\331"..., 49559 <unfinished ...>
1399  write(4, "\370\300\0\7\177\377l\275cs.\0\27$\30\334\330\266}c\333\266m\333\266\235<\261m\333\266m"..., 49404 <unfinished ...>
1399  write(4, "\20\301\0\7\177\377\25\255\252Q\223\340\244w3\247\252\322Z\235\310\2424g\330\274\354\3150\237B\26"..., 49428) = 49428

二.我是否可以以某種方式獲取在進程之間傳輸的資料(相應的行),例如:從13991400或從13991401等(如果有的話)?

謝謝

答案1

寫入從未開啟過的檔案描述符的資料不會到達任何地方。系統write呼叫失敗並顯示EBADF(錯誤的檔案描述符)。

但作為 評論過open不是開啟檔案的唯一方法。還可以pipe創建一對管道端,socketpair創建一對相互通信的套接字,socket以及accept創建與遠端地址通信的套接字等(更不用說您無法write訪問的文件類型,例如目錄、inotify 事件隊列等)

相關內容