我尝试过用linux内核模块挂起系统调用。但是,当我使用Evince打开一个pdf文件时,我发现在这个特定的文件上没有使用open、read和write,只使用lstat。
这里是strace evince folder1/test.pdf的strace日志
所以,我想知道evince从文件中对open和read使用了什么系统调用?
发布于 2018-11-23 03:12:23
正如@ThomasDickey所指出的,您需要传递strace -f选项,以便包含所有线程的跟踪。
( clone()系统正在创建新线程,而不是进程,但您仍然需要-f到有strace跟随螺纹。)
一旦跟踪所有线程,open就会分离,在文件描述符19上以只读模式打开文件:
open("/home/xytao/folder1/test.pdf", O_RDONLY) = 19文件的内容是使用连续的pread调用读取到一个小的256个字符缓冲区中的,第一个缓冲区获取%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到文件的末尾(以确定文件大小),然后从那里读取几个数据块。我想这是关于文档中的页面的信息。
下面的preads发生在文件中间的偏移量,但它们似乎都是以有关“页面”的一些信息开始的,因此,我猜想这是因为它说明了PDF文档中的页面,可能使用了从文件末尾得到的偏移量。
https://unix.stackexchange.com/questions/483562
复制相似问题