Linux strace:order of<;未完成…>;以及<;。。。恢复>;

Linux strace:order of<;未完成…>;以及<;。。。恢复>;,linux,strace,Linux,Strace,我正在编写一个脚本,用于分析使用strace跟踪的文件访问 跟踪包含一些已被另一进程中断的调用strace用和(在中断关闭呼叫的情况下)标记显示它们 还是应该重建为 B [pid 26817]12:48:22.972737关闭(449)=0 [pid 28708]12:48:22.972797 fcntl(451,F_SETFD,FD_CLOEXEC 这里的顺序至关重要,因为在未完成的和恢复的之间可能有多个调用,其中一个调用可能会对此时即将关闭的文件执行某些操作。当strace写入行close

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

跟踪包含一些已被另一进程中断的调用
strace
(在中断
关闭
呼叫的情况下)标记显示它们

还是应该重建为

B
[pid 26817]12:48:22.972737关闭(449)=0
[pid 28708]12:48:22.972797 fcntl(451,F_SETFD,FD_CLOEXEC
这里的顺序至关重要,因为在
未完成的
恢复的
之间可能有多个调用,其中一个调用可能会对此时即将关闭的文件执行某些操作。

strace
写入行
close时,系统调用开始(449),并在输出时结束

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


无法知道关闭文件描述符的确切时间点是哪一点;您只知道在执行系统调用之前它不会关闭,并且在系统调用完成时它会关闭。

跟踪是正确的,您的“重建”不是。如果调用没有重叠,跟踪一开始看起来可能是A或B。我不认为
strace
是错误的。;)我想知道句柄为
449
的文件何时不再打开。我的理解是
close()
调用已被另一个调用中断。如果它实际上正在进行,而另一个进程正在这71毫秒内进行另一个系统调用,这可能与纯技术观点完全不同,但在我的情况下是相同的:当
strace
看到时,文件将被关闭
unfinished
。不是吗?如果程序在调用
close()
后仍在使用文件描述符,那就是一个bug。如果进程在
close()
返回之前再次尝试打开文件,那也可能表示一个bug。因此,调用和返回都显示在跟踪中。请记住,“unfinished”并不意味着什么“在内核级别中断”。相反,这意味着28708的close()系统调用需要一些时间(大约71 usec),在这段时间内,另一个进程/线程启动了一个新的系统调用-28708启动了一个fcntl()。因为strace不能报告返回值(或任何修改的结构“输出”值)在该调用完成之前,它将报告分为两部分:使用“未完成”的调用启动和使用“恢复”的调用完成。如前所述,这具有strace输出交错系统调用报告。
[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>
[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 ...>