我主要使用strace来找出进程似乎挂起的原因,它非常有效。但现在我要用它来分析为什么c程序中的某些锁定似乎不起作用。当我在实际的有问题的程序上运行它时,我看到每个进程都用fcntl锁定了一个特定的文件,该选项被认为是让后来者进程等待前一个进程解锁。strace似乎表明,即使锁在适当的位置,每个进程也只是继续进行。
但是,我编写了自己的c程序来派生4个进程,如果该进程是一个子进程,它将锁定/tmp/test.txt,向其追加几行内容,然后解锁文件。然后我用strace运行它,我看到的结果是我认为不可能的顺序。同样,按照strace,每个进程似乎都会通过fcntl锁继续进行,即使另一个进程已经锁定了它。此外,每个进程似乎都在该进程完成解锁之后对文件执行写入操作。
这个过程的运行方式似乎有一定程度的复杂性,我在寻找文档时遇到了困难。有人能帮我走上正轨吗?
顺便说一句,我检查了使用的fcntl命令,它们似乎是非常标准的用法,并且每个参数都与文档进行了核对。我正在使用Centos 6.6。
发布于 2015-09-11 13:13:08
你说的依据是什么?
每个进程似乎都会通过fcntl锁继续进行,即使另一个进程已经锁定了它
strace中没有以cpu周期为单位打印时间戳的选项,这样您就可以找到两个系统调用之间的时间差。
例如,
pid 11778 10:38:19.729429 ...读取resumed> "",4096) =0
pid 11783 10:38:19.729443写入(1,"\33[?1049h\33[?1h\33=\r",16 >
在上面的输出中,时间戳是strace打印输出的时间,而不是系统调用完成时的确切时刻。因此,我们永远不能说第一个事件在现实中发生得比第二个事件早还是晚。
https://stackoverflow.com/questions/32461454
复制相似问题