我正在编写一个脚本,分析用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
标记自然会表明呼叫现已完成。我想问一下是不是这样。
可以将以上痕迹摘录重建为
[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 ...>
这里的顺序至关重要,因为unfinished
和resumed
之间可能有多个调用,其中一个调用可能会对即将关闭的文件执行某些操作。
答案 0 :(得分:3)
当strace
写入行close(449 <unfinished ...>
时系统调用开始,结束时输出<... close resumed>
。
close
不会被任何其他调用或信号中断:另一个调用由另一个进程执行,而内核正在关闭文件描述符。
无法知道文件描述符关闭时的确切位置;你唯一知道的是,在系统调用执行之前它不会关闭,并且在系统调用完成时它会被关闭。