|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 Crazy迷恋. 于 2014-11-20 23:11 编辑
前言
引用小生到一句话,距离上次发帖是啥时候来着?时间真快啊!刚学完linux 系统编程,趁着没有忘记赶紧整理整理,所有我就想写一个linux 系统编程的帖子,分享给大家。这个系列的内容主要还是以整理为主,内容按照我自己学习的顺序开始写,主要参考我们学校的一个老师写的教材,在这里我会比较多到引用他教材中到内容,也会写一些自己到理解,纯当心得笔记之类的,如果有写到不好到地方还请谅解。
好了废话不多说,既然是linux 系统编程,那么如果需要学习的哥们就必需要有这个系统,现在到虚拟技术做到也成熟,vm ,visual box之类到 装个虚拟机就搞定了。不过这些应该也不需要我多说了。应为能看懂linux 系统编程到人,至少需要熟悉C语言基础。linux/unix基本命令,以及一些基本到操作系统常识。
环境:
我到操作系 Kali Linux 1.0.9 64 位
内核 Linux 3.14-kali1-amd64
GNOME 3.4.2
8G 内存
CPU i5-2450
编译器:gcc version 4.7.2 (Debian 4.7.2-5)
编辑器Vim
C语言标准库与系统函数的区别
大家都清楚,不管是 windows 还是linux /unix 用C语言打印一句话hello world 都是通过printf 当然你也可以用sprintf 只要打到stdout 那么就会显示出来(当然也有缓冲区没刷新到情况)。那么我们讨论区别就要从最初级到hello wordl 讨论起。 其实我们打打hello world 到时候都是打到了 stdout 里去了。stdout stdin stderr,都是一个文件指针,在C标准头文件中已经定义好到。我们可以直接使用。那么问题来了。挖掘。。。。。
那么这些文件指针又指向了哪里?恩~貌似有点跑题了 这个问题我们接下来讨论
我们到重点是在研究标准库和系统函数的区别,其实printf 是向下调用的,printf ,putchar fputs 等等。都是会调用到系统函数write。我们都知道我们打印到屏幕上也就是一个硬件上,硬件都是由操作系统来管理到。操作系统通过各种驱动程序来沟通这些硬件,我们要向屏幕打印hello world 那是不是意味着我们要向硬件发信息呢? 对的。wirte 会继续向下调用。因为write 是一个R3 层的 函数(注:Intel的x86处理器是通过Ring级别来进行访问控制的,级别共分4层,从Ring0到Ring3(后面简称R0、R1、R2、R3)。R0层拥有最高的权限,R3层拥有最低的权限。但windonws 和linux/ unix 都只是使用了r0 和r3 两个级别,这类函数是进入不到内核的,通俗到说是3G-4G,(注:以32位操作系统为例子,每个程序都会有1-4G到虚拟内存空间内核会被映射到3-4G这段空间内)。我们要沟通一个硬件就必须进入到内核去,所有write 会进行system call 系统调用是一种软中断,它会从r3 进入到r0 据说都是用汇编写到 对于更底层到东西我就不清楚了。有兴趣到朋友可以一继续向下研究。
我觉得到这里应该很清晰了C标准库调用->系统库->系统调用进入内核。
所以 系统函数效率要高。printf 和write 这种类型函数相比
在这里 盗用老师到一张图:
man write 默认到是 第一章 第一章是系统命令,第二章是系统函数,所有man 2 write 查到到函数才是对到。
这个函数到用法就以后再谈吧。因为这个函数第一个参数是一个 文件描述符,第二第三就不用多说了,文件描述符这个东西还是留给后边再议论。
输入法用到有点蛋疼,各位见谅。
|
评分
-
参与人数 2 | 荣誉 +9 |
鱼币 +7 |
贡献 +4 |
收起
理由
|
破灬王
| + 5 |
+ 5 |
+ 3 |
热爱鱼C^_^ |
拈花小仙
| + 4 |
+ 2 |
+ 1 |
强烈支持恋恋~ |
查看全部评分
|