strace“乱序”

时间:2015-09-08 15:15:48

标签: process linux-kernel strace fcntl

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

但是,我创建了自己的c程序来分叉4个进程,如果进程是子进程,它会锁定/tmp/test.txt,向它添加几行,然后解锁该文件。然后我用strace运行它,我看到的结果是我认为不可能的顺序。再次,通过strace,每个进程似乎都通过fcntl锁进行,即使另一个进程已经锁定它。此外,每个进程似乎都会在该进程完成解锁后写入文件。

如果流程运行起来似乎有一定程度的复杂性,我无法找到文档。有人可以帮助我走上正轨吗?

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

1 个答案:

答案 0 :(得分:0)

你在什么基础上说

  

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

在strace中没有选项可以在cpu周期中打印时间戳,这样就可以找到两次系统调用之间的时间差异。

例如,

  

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

     

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

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