我尝试使用 Linux 内核模块来挂钩系统调用。但是,当我使用 Evince 打开 pdf 文件时,我发现没有open
,read
并且write
在此特定文件上使用,仅lstat
使用。
这里是strace
的日志strace evince folder1/test.pdf
所以我想知道 evince 对文件使用什么系统open
调用read
?
答案1
正如@ThomasDickey 所指出的,您需要传递strace
该-f
选项,以便包含所有线程的跟踪。
(clone()
系统调用正在创建新线程,而不是进程,但您仍然-f
需要有strace
关注话题.)
一旦您跟踪了所有线程,就会open
变为父线程,在文件描述符 19 上以只读模式打开文件:
open("/home/xytao/folder1/test.pdf", O_RDONLY) = 19
通过对 256 个字符的小型缓冲区进行一系列pread
调用来读取文件的内容,其中第一个调用获取%PDF-1.3
标头:
pread(19, "%PDF-1.3\r\n%\241\263\305\327\r\n3 0 obj\r\n<</Fil"..., 256, 0) = 256
如果您查看跟踪,您会看到它会lseek
到达文件末尾(以确定文件大小),然后从那里读取几个数据块。我认为这是有关文档中页面的信息。
以下pread
内容发生在文件中间的偏移处,但所有这些似乎都以有关“页面”的一些信息开始,因此我认为这是计算 PDF 文档中页面的证据,可能使用从文件末尾。