Chinaunix

标题: 如何知道系统调用的层次关系 [打印本页]

作者: HJLin    时间: 2008-09-17 09:32
标题: 如何知道系统调用的层次关系
比如说 我调用printf函数
那么系统最终分别是调用的哪些函数呢
??
速度
作者: liying_gg    时间: 2008-09-17 09:32
http://www.gnome.org/~newren/tut ... e/html/ch03s02.html
你可以看看怎么使用strace,gdb我觉得应该不行吧,没用过。
作者: dreamice    时间: 2008-09-17 09:44
标题: 回复 #1 HJLin 的帖子
在不同的系统中,系统调用最终调用的函数是不一样的。比如说,read,write,系统调用进入内核后,一般是调用sys_read和sys_write,(大多数系统调用在内核空间的实现都是sys_XXXX),但实现又分为字符设备和块设备的区别了,字符设备和块设备又有很多类型(如串口字符设备,磁盘块设备,同时磁盘设备又包括通用磁盘,flash等等)。所以,底层驱动的实现是个未知数,只能根据具体的系统来讨论。
你提到的printf,它实际上是一个标准库函数,而并非系统调用(系统调用是用户空间进入内核空间的入口点)。如果你细心阅读源代码,可以看到printf-->write,即printf实际上是调用了write这个系统调用,如果存在对应的终端,则write把对应的输出显示到终端设备上,这些可以说是具体底层驱动的实现了。
作者: liying_gg    时间: 2008-09-17 09:49
你可以安装一个strace,这样就能看你可执行文件的系统调用。
作者: HJLin    时间: 2008-09-17 09:51
标题: 回复 #2 dreamice 的帖子
谢谢!
但是不是很清楚,可以用什么工具gdb之类的查看吗?
就是说printf 最终还是调用了系统调用吧!
作者: HJLin    时间: 2008-09-17 09:54
我先看看先
作者: eveson    时间: 2008-09-17 09:58
你去看源代码最好。
作者: dreamice    时间: 2008-09-17 10:15
原帖由 HJLin 于 2008-9-17 09:51 发表
谢谢!
但是不是很清楚,可以用什么工具gdb之类的查看吗?
就是说printf 最终还是调用了系统调用吧!


gdb只能跟踪应用程序,而系统调用是进入内核空间的接口,对于内核的跟踪,gdb将显得无能为力。
printf最终调用了write这个系统调用,而write调用了底层的sys_write,然后调用相应的驱动程序,并输出到终端。你只要知道这条线,然后看源代码,可能理解会更好一些。
作者: dreamice    时间: 2008-09-17 10:17
原帖由 HJLin 于 2008-9-17 09:32 发表
比如说 我调用printf函数
那么系统最终分别是调用的哪些函数呢
??
速度


老大,分都散了啊,不知道都给谁了
作者: MMMIX    时间: 2008-09-17 10:28
原帖由 dreamice 于 2008-9-17 10:17 发表


老大,分都散了啊,不知道都给谁了

在二楼可以看到。
作者: eveson    时间: 2008-09-17 10:48
:em12: 这分数,没抢上。
作者: cjaizss    时间: 2008-09-17 12:53
UNIX-like OS下,printf最终通过write系统调用来实现




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2