我正在编写一个脚本,用于分析以跟踪的文件访问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
Run Code Online (Sandbox Code Playgroud)
该进程及其所有线程均已通过以下方式跟踪
strace -f -tt -p <pid>
Run Code Online (Sandbox Code Playgroud)
手册页不确定调用何时完成。
如果正在执行系统调用,同时正在从不同的线程/进程调用另一个系统调用,则strace将尝试保留这些事件的顺序,并将正在进行的调用标记为未完成。呼叫返回时,它将被标记为已恢复。
尽管我假设是这样,但resumed标记自然会指示该呼叫现在已经结束。我想问是否是这样。
可以将上述跟踪摘要重构为
[pid 28708] 12:48:22.972797 fcntl(451, F_SETFD, FD_CLOEXEC <unfinished ...>
[pid 26817] 12:48:22.972808 close(449) = 0
Run Code Online (Sandbox Code Playgroud)
还是应该重建为
[pid 26817] 12:48:22.972737 close(449) = 0
[pid 28708] 12:48:22.972797 fcntl(451, F_SETFD, FD_CLOEXEC <unfinished ...>
Run Code Online (Sandbox Code Playgroud)
这里的顺序至关重要,因为unfinished和之间可能有多个调用,resumed并且其中一个可能会对当前将要关闭的文件执行某些操作。
系统调用在写行时开始,在输出时结束。straceclose(449 <unfinished ...><... close resumed>
在close不被任何其他呼叫或信号中断:对方通话被另一进程执行的,而内核关闭您的文件描述符。
没有办法知道关闭文件描述符的确切时间。您所知道的唯一一件事是在执行系统调用之前它不会关闭,并且在系统调用完成时它会关闭。