NAME¶
fcopy -
從一個通道向另一個複製數據
總覽 SYNOPSIS¶
fcopy inchan outchan ?
-size size?
?
-command callback?
描述 DESCRIPTION¶
fcopy 命令從一個 I/O 通道
inchan 向另一個 I/O 通道
outchan 複製數據。
fcopy
命令在 Tcl I/O
系統中起到緩沖的槓桿作用(leverage),它避免額外的複製,並且在向慢速目標如網路套接口複製大檔案的時候避免在主存中緩沖過多的數據。
fcopy 命令從
inchan
傳輸數據直到檔案結束或傳輸完
size字節。如果沒有給出
-size
參數,則複製持續到檔案結束。從
inchan讀的所有數據都複製到
outchan。如果沒有
-command選項,在複製完成並返回寫到
outchan 的字節數之前
fcopy
將阻塞。
-command 參數使
fcopy在背景工作。在這種情況下它立即返回,並在複製完成時調用
callback。調用
callback
加上一個或兩個額外的參數來指示有多少字節被寫到了
outchan。在背景複製期間如果發生了一個錯誤,第二個參數是與錯誤相關聯的錯誤字符串。使用背景複製不需要把
inchan 或
outchan
轉換成非阻塞模式;
fcopy
命令將自動關照這些。但是,需要使用
vwait 命令或使用 Tk
進入事件循環。
在背景複製期間不允許對
inchan 或
outchan 做其他 I/O
操作。如果在複製進行期間
inchan 或
outchan
中被關閉,停止當前的複製並且不做命令回調。如果
inchan被關閉,則寫出為
outchan
而排隊(queue)的所有數據。
注意在一個命令複製期間
inchan
可以變成可讀的。在一個背景複製期間你應該關閉任何
fileevent句柄,這樣這些句柄不與複製相觸及(interfere)。通過一個
fileevent句柄的任何 I/O
嘗試將得到一個 "channel
busy" 錯誤。
Fcopy 依據
inchan 和
outchan 的
-translation選項來轉換它們中的檔案行結束序列。參見
fconfigure的手冊條目來得到
-translation
選項的詳情。轉換意味著從
inchan
讀到的字節數與寫到
outchan.的字節數可能不同。只報告寫到
outchan中的字節數。要麼作為同步的
fcopy
的返回值,要麼作為給異步的
fcopy 的回調的參數。
範例 EXAMPLE¶
第一個例子展示了回調如何得到傳遞給它的傳輸了的字節數。它還使用
vwait
來使應用進入事件循環。當然,不使用回調也能做出這個簡化了的例子。
proc Cleanup {in out bytes {error {}}} {
global total
set total $bytes
close $in
close $out
if {[string length $error] != 0} {
# error occurred during the copy
}
}
set in [open $file1]
set out [socket $server $port]
fcopy $in $out -command [list Cleanup $in $out]
vwait total
第二個例子按塊(chunk)複製並在命令回調中測試檔案結束。
proc CopyMore {in out chunk bytes {error {}}} {
global total done
incr total $bytes
if {([string length $error] != 0) || [eof $in] {
set done $total
close $in
close $out
} else {
fcopy $in $out -command [list CopyMore $in $out $chunk] \
-size $chunk
}
}
set in [open $file1]
set out [socket $server $port]
set chunk 1024
set total 0
fcopy $in $out -command [list CopyMore $in $out $chunk] -size $chunk
vwait done
參見 SEE ALSO¶
eof(n), fblocked(n), fconfigure(n)
關鍵字 KEYWORDS¶
blocking, channel, end of line, end of file, nonblocking, read, translation
[中文版維護人]¶
寒蟬退士
[中文版最新更新]¶
2001/08/02
《中國 Linux 論壇 man 手冊頁翻譯計劃》:¶
http://cmpp.linuxforum.net