7
回答
请教linux内核系统调用与库函数的区别?
利用AWS快速构建适用于生产的无服务器应用程序,免费试用12个月>>>   

<无详细内容>

举报
qinuxman
发帖于4年前 7回/1K+阅
共有7个答案 最后回答: 4年前
man syscalls 或者 Google搜 site:man7.org syscalls
http://man7.org/linux/man-pages/man2/syscalls.2.html
The system call is the fundamental interface between an application and the Linux kernel.
System calls are generally not invoked directly, but rather via wrapper functions in glibc (or perhaps some other library).
--- 共有 1 条评论 ---
eechen应用程序和Linux内核的函数接口就是系统调用,应用程序通过glibc或者其他一些库封装的函数进行系统调用. 4年前 回复

C库实现了标准C库函数和系统调用接口

所谓的什么write,read都是系统调用的接口

在内核层系统调用都是syscall

--- 共有 1 条评论 ---
qinuxman我看《Linux内核完全注释》里面讲的它们有一些差别,感觉你讲的意思好像是c库实现了给程序进行系统调用的接口,与书中所说有所出入…… 4年前 回复
Linux上可以使用strace轻松 跟踪到程序进行了那些系统调用,比如 跟踪Nginx的工作进程,假设其PID为1024:
siege -c2 -t1M http://127.0.0.1 触发Nginx工作
sudo strace -Tp 
1024 动态观察
sudo strace -Tcp 1024 按Ctrl+C退出生成观察报告
你可以看到Nginx工作进程进行了 epoll_wait 等等系统调用。
注意: 跟踪会使进程的运行效率明显下降。

    库函数当中的某些函数,比如read、write等,如果需要输出到屏幕或者输出到文件,编程语言本身又不支持实现这些功能,只能进一步去进行系统调用才能实现。
    C在一定程度上是可移植的语言,为了在不同的操作系统下正常编译实现同样功能,需要定义一组抽象接口,在不同的操作系统提供具体的实现。
    比如库函数中read、write等函数,将实际的读取文件、写入文件等动作进行了抽象,也就是提供了编程接口(API),再由不同的操作系统下的编译器实现,在Linux系统下,通过GCC的相关库函数进一步调用了内核系统调用实现,在Windows系统下,通过微软的C编译器的相关库函数调用了windows内核系统调用实现,也可以有很多其他实现比如borland的C库。 


    总之就是说语言本身不能实现的那部分库函数是抽象接口,最终需要通过调用系统调用实现。程序直接系统调用会部分损失对不同系统的可移植性。


我是这么理解的可能不太准确。

库函数就是为了方便编程,代码复用而出现的,重复功能没有必要再让程序员实现一遍,像strcpy,memset等都是库函数,系统调用就是运行在用户态的程序需要切换到内核到调用的库函数,是用户态与内核态切换的接口,像malloc,库函数包含系统调用!不过两个都可以通过程序员添加!
顶部