strace:<unfinished ... =“”>和&lt; ...恢复&gt; </unfinished>的顺序

时间:2014-07-12 19:09:07

标签: linux strace

我正在编写一个脚本,分析用strace跟踪的文件访问权限。

跟踪包含一些已被另一个进程中断的调用。 strace <unfinished ...><... close resumed>(如果有close次通话)标记,则会显示{。}}。

[pid 26817] 12:48:22.972737 close(449 <unfinished ...>
[pid 28708] 12:48:22.972797 fcntl(451, F_SETFD, FD_CLOEXEC <unfinished ...>
[pid 26817] 12:48:22.972808 <... close resumed> ) = 0 

使用

跟踪进程及其所有线程
strace -f -tt -p <pid>

手册页不确定呼叫何时结束。

  

如果正在执行系统调用,同时从另一个线程/进程调用另一个系统调用,则strace将尝试保留这些事件的顺序并将正在进行的调用标记为未完成。当呼叫返回时,它将被标记为已恢复。

虽然我假设,resumed标记自然会表明呼叫现已完成。我想问一下是不是这样。

可以将以上痕迹摘录重建为

A

[pid 28708] 12:48:22.972797 fcntl(451, F_SETFD, FD_CLOEXEC <unfinished ...>
[pid 26817] 12:48:22.972808 close(449) = 0

或应该重建为

[pid 26817] 12:48:22.972737 close(449) = 0 
[pid 28708] 12:48:22.972797 fcntl(451, F_SETFD, FD_CLOEXEC <unfinished ...>

这里的顺序至关重要,因为unfinishedresumed之间可能有多个调用,其中一个调用可能会对即将关闭的文件执行某些操作。

1 个答案:

答案 0 :(得分:3)

strace写入行close(449 <unfinished ...>时系统调用开始结束时输出<... close resumed>

close不会被任何其他调用或信号中断:另一个调用由另一个进程执行,而内核正在关闭文件描述符。

无法知道文件描述符关闭时的确切位置;你唯一知道的是,在系统调用执行之前它不会关闭,并且在系统调用完成时它会被关闭。