zhenxiaoyu 发表于 2015-03-12 10:50

文件鼠标点击复制粘贴调用内核的哪个函数

在终端中使用cp来复制粘贴文件,是通过read(oldfile)然后write(newfile)来完成的,即调用了read和write系统调用来读写,那么我通过鼠标点击复制粘贴会调用内核中的什么函数呢,我在write下添加了判断条件,通过cp可以打印相应的信息,复制粘贴就不能打印相应的信息。求解答!

nswcfd 发表于 2015-03-12 12:01

楼主的“复制粘贴”是指文件级别的复制粘贴(资源管理器)还是指文本块级别的复制粘贴(编辑器)?

如果是后者,应该跟X server的实现有关系吧?肯定是某种形式的进程间通讯,未必一定通过文件系统的read/write来实现的。

zhenxiaoyu 发表于 2015-03-12 14:13

是文件级别的,我是要判断文件动作,如果文件进行了复制操作,会在dmesg中打印一条消息,cp我可以捕捉到,但是复制粘贴因为不走write?(read还是照样走的)所以我无法获取回复 2# nswcfd


   

nswcfd 发表于 2015-03-12 22:48

也许是因为使用了sendfile之类的API?
能不能用strace验证一下?

zhenxiaoyu 发表于 2015-03-13 09:09

鼠标点击怎么用strace回复 4# nswcfd


   

nswcfd 发表于 2015-03-13 11:13

不好意思,对X的架构不熟悉,不知道。

尝试用jprobe对sys_open写了一个探针,里面打印出current->comm,
发现在ubuntu/gnome里面,鼠标粘贴此操作调用sys_open(mode=write)的时候,current及其parent进程分别是pool和gnome-session。

没研究过X,不知道这个pool对于哪个ELF?
gone-session貌似是个后台daemon,尝试attach一下(follow子进程)?

nswcfd 发表于 2015-03-13 11:47

sorry,应该attach nautilus(文件管理器), 而不是attach gnome-session

貌似是利用pipe + splice系统调用实现文件拷贝的。
在vfs层面对应f_op->splice_read、splice_write接口。

amarant 发表于 2015-03-13 12:24

可以用perf/ ftrace这些工具分析一下

zhenxiaoyu 发表于 2015-03-13 17:17

谢谢拉,使用鼠标复制粘贴的确是和终端cp不一样,鼠标复制粘贴是通过generic_file_splice_write,我还有一个问题,gedit编译文件是走的内核哪条路,好像write系统调用和splice_write都捕获不到回复 7# nswcfd


   
页: [1]
查看完整版本: 文件鼠标点击复制粘贴调用内核的哪个函数