这行来自不同的文件(TCL)是什么?

时间:2016-06-14 13:54:17

标签: tcl

我在下面列出了相关的代码,我可以解释一下我知道它到底在做什么:

proc rshm {where {i 0}} {
    global ob
    set what "???"
    set ob(last_rshm_failed) "yes"
    if {![info exists ob(shm)]} {
        return "0.0"
    }
    if {[info exists ob(shm_puts_exist_in_progress)]} {
        return "0.0"
    }
    shm_puts "g $where $i"
    gets $ob(shm) istr
    set what [lindex $istr 0]
    set ob(last_rshm_failed) "no"
    if {[string equal $what "?"]} {
        set ob(last_rshm_failed) "yes"
        puts stderr $istr
        return "0.0"
    }
    set what [lindex $istr 3]
    return $what
}

通过查看程序的其余部分,我得出结论,前两个if语句正在检查其他地方的错误,并且设计用于在错误触发时终止该过程。

在程序的其他地方,函数被调用的地方(感兴趣的)的形式为:rshm ft_xdev

使用print语句,我发现ft_xdev以shm_puts" g ft_xdev 0"传递进程。

让我失望的是行:获取$ ob(shm)istr

对$ ob(shm)的调用是另一个文件(最初是二进制程序,但是可读的版本在C ...中),但是在查看这个文件时,没有引用任何名为" ISTR&#34 ;.

有人会介意帮助我解决这条线从其他文件中得到的内容吗?如果需要,我可以从程序中提供更多代码。

2 个答案:

答案 0 :(得分:0)

代码:

gets $ob(shm) istr

将传递ob(shm)变量的内容(应该是至少可以读取的通道句柄)和字符串istr(在这种情况下用于命名变量)进入gets命令。在这种情况下,istr将是一个局部变量,因为它没有明确说明。

gets命令,当给出两个参数时,将从通道(第一个arg)读取一行文本,并将该行文本写入变量(第二个arg)。然后,如果存在可恢复的错误条件(例如文件结束),则会产生读取 -1的字符数。你忽略了结果。 (严重错误将成为例外。)这些都记录在the manual page for gets上。

tl; dr:$ob(shm)频道读取一行文字并将其存储在istr

答案 1 :(得分:0)

此过程将返回$istr[lindex $istr 3])的第3个索引(如果它不为空或在先前检查中未失败)。

$istr的内容来自抓取打开文件频道$ob(shm)的下一行(如果频道已打开且$ob(shm_puts_exist_in_progress)不存在)。< / strong>

如果shm_puts "g $where $i"以任何方式影响$ ob,那么包含shm_puts过程非常重要,因为它可能会影响$istr,但我怀疑shm_puts的内容}与$istr无关。

最后,如果$istr以?开头?然后它中止此过程,将$istr的内容显示给stderr。也就是说,如果文件的一行以?开头,则程序将中止。

所有过程中止(即IF检查)都不保留$istr的内容,因为它的局部变量不是全局变量,所以检查$ istr的内容必须在此过程中完成并且在获取之后命令。