我在下面列出了相关的代码,我可以解释一下我知道它到底在做什么:
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 ;.
有人会介意帮助我解决这条线从其他文件中得到的内容吗?如果需要,我可以从程序中提供更多代码。
答案 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的内容必须在此过程中完成并且在获取之后命令。