【问题标题】:strace "out of order"strace “乱序”
【发布时间】:2015-09-08 15:15:47
【问题描述】:

我主要使用 strace 来找出进程似乎被挂起的原因,并且非常有效。但现在我用它来分析为什么 c 程序中的某些锁定似乎不起作用。当我在实际的问题程序上运行它时,我看到每个进程都使用 fcntl 锁定某个文件,该选项应该让后来的进程等待前一个进程解锁。 strace 似乎表明即使锁定到位,每个进程也会继续进行。

但是,我制作了自己的 c 程序来分叉 4 个进程,如果该进程是子进程,它会锁定 /tmp/test.txt,在其上附加几行,然后解锁文件。然后我用 strace 运行它,我看到的结果按照我认为不可能的顺序排列。同样,通过 strace,每个进程似乎都通过 fcntl 锁继续进行,即使另一个进程已经将其锁定。此外,每个进程似乎都会在该进程完成解锁后写入文件。

流程的运行方式似乎存在一定程度的复杂性,我无法找到相关文档。有人可以帮助我走上正轨吗?

顺便说一句,我检查了使用的 fcntl 命令,它们似乎是非常标准的用法,并且每个参数都与文档一起检查。我正在使用 Centos 6.6。

【问题讨论】:

    标签: process linux-kernel strace fcntl


    【解决方案1】:

    你说的依据是什么

    每个进程似乎都通过 fcntl 锁继续进行,即使另一个进程已经锁定了它

    strace 中没有选项以 cpu 周期打印时间戳,以便您可以找到两个系统调用之间的时间差。

    例如,

    [pid 11778] 10:38:19.729429 <...> "", 4096) = 0

    [pid 11783] 10:38:19.729443 write(1, "\33[?1049h\33[?1h\33=\r", 16 >

    在上面的输出中,时间戳是 strace 打印输出的时间,而不是系统调用完成的确切时间。所以我们永远不能说第一个事件在现实中比第二个事件发生得早还是晚。

    【讨论】:

    • 谢谢尼森。我正在重新检查 strace 中的时间。旧的大脑回路正在慢慢苏醒。
    猜你喜欢
    • 2010-11-14
    • 2012-05-26
    • 2014-09-03
    • 2012-06-01
    • 2015-09-09
    • 2018-05-15
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    相关资源
    最近更新 更多