Могу ли я найти имя файла из дескриптора файла в Tcl? - PullRequest
4 голосов
/ 28 февраля 2012

Аналогично Могу ли я найти имя файла из дескриптора файла в Perl? , но в Tcl.

В любом случае я планирую кешировать ассоциации между именами файлов и файловых дескрипторов, поэтому я спрашиваю просто из любопытства - особенно о «волшебстве операционной системы», упомянутом в ссылке. Возможно ли это в Tcl?

Если это имеет значение, я (вынужден) использовать Tcl 8.0.5 в SunOS 5.10.

Ответы [ 3 ]

5 голосов
/ 28 февраля 2012

С такой старой версией Tcl у вас действительно не так много вариантов.Самое простое - немного обернуть open и close:

rename open _original_open
rename close _original_close

proc open {filename args} {
    global fileForChannel
    set channel [eval [list _original_open $filename] $args]
    set fileForChannel($channel) $filename
    return $channel
}
proc close {channel} {
    global fileForChannel
    catch {unset fileForChannel($channel)}
    _original_close $channel
}

Затем вы можете получить имя файла для открытого канала $ch, просто прочитав $fileForChannel($ch).

1 голос
/ 28 февраля 2012

Я посмотрел и не нашел способа получить имя файла из дескриптора, поэтому я создал собственное решение. Это решение использует команду trace для перехвата при выходе из команды open . В это время доступны имена и дескрипторы файлов, поэтому я связываю их друг с другом через глобальный массив fileNameFromHandle .

# This script demonstrate the use of the trace command to keep track
# the relationship between file handles and file names

# ======================================================================
# Setup trace to track file handle vs. file name
array set fileNameFromHandle {}
proc trace_proc {command code result op} {
    if {$code != 0} return; # Ignore failed calls

    set filename [lindex $command 1]; # command = {open filename mode}
    set filehandle $result
    set ::fileNameFromHandle($filehandle) $filename
}
proc getFileName {handle} { return $::fileNameFromHandle($handle) }
trace add execution open leave trace_proc

# ======================================================================
# Main
set handle1 [open file1.txt r]

# Do something with the files

# Need filename from handle?
puts "Handle: $handle1, filename: [getFileName $handle1]"

close $handle1

Обновление

У меня нет Tcl 8.0.5, чтобы проверить, работает ли это решение. Пожалуйста, попробуйте и дайте мне знать. Вы также можете отследить команду close , чтобы удалить связь.

0 голосов
/ 23 июня 2015

Вы можете запустить: Exec Lsof | grep -w [pid] | grep -w [fstat $ file_handle ino]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...