linux-man命令中的编号含义(包括系统调用和库函数讲解)

博文说明【前言】:

本文将通过个人口吻介绍linux的man命令中的编号含义(包括系统调用和库函数解释),在目前时间点【2017年6月13号】下,所掌握的技术水平有限,可能会存在不少知识理解不够深入或全面,望大家指出问题共同交流,在后续工作及学习中如发现本文内容与实际情况有所偏差,将会完善该博文内容。

本文参考文献引用链接:

1、http://www.cnblogs.com/chao1118/p/3715523.html
2、http://blog.csdn.net/high_high/article/details/7200053
3、http://www.cnblogs.com/yudao/p/4369982.html
4、http://blog.csdn.net/skyflying2012/article/details/10044343【这篇文章不错】



正文:


Linux man中的man就是manual的缩写,用来查看系统中自带的各种参考手册,
命令格式:man [n] command
man命令拥有9个选项编号,其对应的关系如下:

1 Executable programs or shell commands
2 System calls (functions provided by the kernel)
3 Library calls (functions wiroutinesthin program libraries)
4 Special files (usually found in /dev)
5 File formats and conventions eg /etc/passwd
6 Games
7 Miscellaneous (including macro packages and conventions), e.g. man(7), groff(7)
8 System administration commands (usually only for root)
9 Kernel routines [Non standard]

英文直译:

1、可执行程序或者shell命令
2、系统调用(内核可以调用的函数,运行在核心态,内核空间,系统核心可直接呼叫的函数与工具等,通过这个,可以很方便的查到调用某个函数,需要加什么头文件,例如open,write函数)
3、库函数(运行在用户态,用户空间,一些常用的函数与函数库,大部分为c的函数库,例如print,fread)
4、特殊设备(一般是/dev下的各种设备,例如硬盘设备,光盘等)
5、文件格式(说明这个文件中的各个字段的含义,例如/etc/passwd)
6、游戏(保留给游戏使用,由各个游戏自己定义)
7、杂项,例如Linux文件系统,网络协议等,变量说明等
8、系统管路员命令(只有管理员才能使用的命令,例如ifconfig,reboot等)
9、跟kernel内核有关的文件

示例:
suse11sp3-1:~ # man passwd
Man: find all matching manual pages
 * passwd (1)
   passwd (5)
   passwd (1ssl)
Man: What manual page do you want?
Man:

在这里如果我们
输入1,就是说我们想要查看有关/usr/bin/passwd这个命令有关的信息
输入5,就是说我们想要查看有关/etc/passwd这个文件有关的信息
输入1ssl,就是说我们我们想要查看openssl passwd 这个命令有关的信息

什么是系统调用和库函数?

一、系统调用

系统调用(system call)是操作系统内核提供的函数,在内核态运行(kernel mode),是操作系统为用户提供的一些接口,属于函数中的低等下人,虽然低等,但是谁也离不开他们,因为离开他们就没办法和内核打交道了,没办法和内核打交道就什么都歇菜了。
例如标准C库函数printf()可以被看做是一个通用的输出语句,但它实际做的是将数据转化为符合格式的字符串并且调用系统调用write()输出这些字符串。我要printf("hello,world!"),实际上是调用的write()来实现的,而这个write()就是系统提供的接口函数

那么系统调用的意义是什么?

1、系统调用把我们从底层的硬件编程中解放了出来。

你想想看,你写一个程序还需要自己去实现在屏幕上打印字符串的代码,这也太累人了吧。

2、提高系统安全性

系统调用是内核代码,内核代码能访问系统上的所有地址空间,而我们执行的代码是用户空间的代码,用户空间的代码在对系统进行操作时是有限制的,(作为一个菜鸟程序员,系统如果不对你写的代码进行限制,万一把系统搞蹦了呢)。因此系统调用的另一个功能就是维护了系统的安全性,你要用就直接调用我这个接口就行了,不用你自己写。

3、系统调用还有一个功能就是为了方便程序的移植性。。
 
总之,你就把系统调用当做一个系统底层接口,什么时候你需要使用它了,调用一下它就行了,既方便又安全。

二、库函数


库函数是高层的,是在系统调用上的一层包装,运行在用户态(user mode),为程序员提供调用真正的在幕后完成实际事务的系统调用的更为方便的接口。其实你可以把库函数当做是对系统调用的又一次封装。打个比方吧,库函数相当于包工头,系统调用是工人,我们可以自己找工人分任务,但一般是把任务摊给包工头,包工头再去给工人分任务。

那么库函数的意义是什么?

1、提高程序的执行效率。

系统调用作为内核提供给我们的接口,它的执行效率是比较高效精简的。但是有时候我们需要对获取的信息进行更复杂的处理,这个时候如果我们把这些处理过程包装成一个函数再提供给程序员,不是更方便编程了吗?因此一个库函数有可能含有一个系统调用,有可能有好几个系统调用,当然也有可能没有系统调用,比如有些操作就不需要涉及内核的功能。

2、提高程序的可移植性

从程序的可移植性的角度来看,相对于系统调用,C语言的标准备函数库(ANSI C)具备较高的可移植性,在不同的系统环境下,只要做很少的修改,通常情况是不需要修改的。

所以虽然最终所有的工作都是系统调用做的,但是我们更通常的做法是调用库函数,有以下几个原因:

1、库函数提供了抽象,抽象是个好东西,可以让我们把更多的注意力集中在要解决问题的核心。
2、库函数给我们提供的接口更人性化,所以调用起来更方便。
3、调用库函数更安全,内存管理不用自己太操心。
4、调用库函数效率更高,程序跑的更快。虽然库函数最终是调用系统函数,但是库函数会比我们用更好的方式方法调用系统函数。因为系统调用是内核态的函数,每次调用内核都要从用户态切到内核态,更主要的是库函数内部的缓存,可以减少系统调用的次数,同样100次输出,写成系统调用就是赤裸裸的100次系统调用,相当慢;而写成库函数就可能被内部缓存保存起来调用一次系统调用输出,一次哦,效率当然也就快了。但是一些特殊情况下只能使用系统调用,比如编写驱动程序,使用特殊的输入输出控制等等。

补充:
库函数不光可以在系统调用的基础上包装,也可以在其他库函数的基础上包装,提供更高级的抽象,更强大的功能。比如OGRE对OpenGL的包装,Qt对Xlib的包装,类似于从老总到秘书到部门主管到包工头再到工人的过程,当然我我们就是老总了,只要我们高兴,不光调用秘书(好邪恶啊。。。),直接调用主管,包工头,甚至自己当工人都可以,自己写个系统调用,然后重新编译内核,然后再调用自己写的系统调用,可以参考下方链接。

自行编写系统调用:跳转链接:http://tldp.org/HOWTO/html_single/Implement-Sys-Call-Linux-2.6-i386/#AEN27

总结:

系统调用是为了方便应用程序使用操作系统的接口,而库函数是为了方便人们编写应用程序而引出的

最后介绍两个工具,strace和ltrace。
strace查看我们的可执行文件调用了哪些系统调用
ltrace查看可执行文件调用了哪些库函数,喜欢逆向工程的朋友一定很喜欢。
用法很简单,直接在命令后面跟可执行文件路径就好了。



结尾:

感谢阅读,祝有收获的一天,谢谢!

时间: 2024-10-12 21:10:43

linux-man命令中的编号含义(包括系统调用和库函数讲解)的相关文章

linux-man命令中的编号含义

我们在linux中经常会使用man命令,但是往往我们使用 man xxxx的时候会出现几个数字选项让我们选择,这个时候就需要知道,该数字选项对应的含义. 参考链接:https://en.m.wikipedia.org/wiki/Man_page The manual is generally split into eight numbered sections, organized as follows (on Research Unix, BSD, macOS and Linux): Sect

Linux Free命令每个数字的含义 和 cache 、buffer的区别

Linux Free命令每个数字的含义 和 cache .buffer的区别 我们按照图中来一细细研读(数字编号和图对应)1,total:物理内存实际总量2,used:这块千万注意,这里可不是实际已经使用了的内存哦,这里是总计分配给缓存(包含buffers 与cache )使用的数量,但其中可能部分缓存并未实际使用.3,free:未被分配的内存4,shared:共享内存5,buffers:系统分配的,但未被使用的buffer剩余量.注意这不是总量,而是未分配的量6,cached:系统分配的,但未

Linux shell命令中expr

在Linux shell命令中expr虽然不是很起眼,但是它的作用是非常大的!到目前为止,我个人看来最大的作用就是两个——四则运算和字符串的操作. 先说四则运算,在Shell中四则运算不能简简单单的加减乘除,应该要写如下的格式: $val1=`$val2 - 1` 其中“=”后面用“`”包住表达式,这个符号在Shell中十分有用,是Tab键上面“~”的原来形式.可以用来将很多命令的结果保存到一个变量中去.接着就是运算符了,运算符的左右两边必须是空格,否则会出错. 接着是强大的字符串操作: 提取指

Linux top命令中CPU信息的详解(转)

add by zhj: 下面的文章解释的很好了,这里再说明一下top命令中wa的含义,我们知道,当IO阻塞时,操作系统会把进程改为阻塞态,将CPU调度到运行其它进程. CPU在空闲状态下,会检查是否有阻塞的IO(磁盘或网络),如果有,那就认为是wa:如果没有,那才是真正的idle.在top命令中,85.1%id是真正的idle占比,而且有下面的公式 us + sy + ni + id + wa + hi + si + st = 100%,当wa比较高时,比如超过30%时,说明IO读写很慢,用su

linux free命令中buffer与cache的区别

linux free命令中buffer与cache的区别 ~$ free total             used           free     shared   buffers     cached Mem:       1025204     981636      43568          0      38244     387808 -/+ buffers/cache:       555584      469620 Swap:      1931256    162

linux sed命令中的正则表达式问号、加号、圆括号等需要转义

linux sed命令内的正则表达式语法分两种,一种叫Basic (BRE) Syntax,另一种叫Extended (ERE) Syntax.默认使用的是BRE. 这个BRE就是一个简化版,语法稍微有点不一样,问号.加号.圆括号.花括号和竖线没有特殊含义,就代表字符本身,如果要原本定义的实现特殊含义,需要用反斜杠(\)转义……详情请见: https://www.gnu.org/software/sed/manual/html_node/BRE-vs-ERE.html#BRE-vs-ERE

[zz]linux find命令中-print0和xargs中-0的用法

  默认情况下, find命令每输出一个文件名, 后面都会接着输出一个换行符 ('n'), 因此find 的输出都是一行一行的: [bash-4.1.5] ls -ltotal 0-rw-r--r-- 1 root root 0 2010-08-02 18:09 file1.log-rw-r--r-- 1 root root 0 2010-08-02 18:09 file2.log[bash-4.1.5] find -name '*.log'./file2.log./file1.log 比如用f

Linux grep 命令中的正则表达式详解

在 Linux .类 Unix 系统中我该如何使用 Grep 命令的正则表达式呢? Linux 附带有 GNU grep 命令工具,它支持扩展正则表达式(extended regular expressions),而且 GNU grep 在所有的 Linux 系统中都是默认有的.Grep 命令被用于搜索定位存储在您服务器或工作站上的任何信息. 正则表达式 正则表达式就是用于匹配每行输入的一种模式,模式是指一串字符序列.下面是范例: ^w1 w1|w2 [^ ] grep 正则表达式示例 在 /e

linux top命令中的cache & buffers

今天用top查看系统具体进程使用系统资源的情况时,对cache和buffer这两个概念不是很清楚,研究了一下: **cache是高速缓存,用于CPU和内存之间的缓冲: **buffer是I/O缓存,用于内存和硬盘的缓冲* [原文链接](http://blog.chinaunix.net/uid-24020646-id-2939696.html) 当你在linux下频繁存取文件后,物理内存会很快被用光,当程序结束后,内存不会被正常释放,而是一直作为caching.这个问题,貌似有不少人在问,不过都