重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
linux kernel只提供一种叫系统调用给应用程序,linux系统提供了glibc这样的函数库专门封装了内核提供的系统调用,所以应用程序的开发就直接调用glibc库提供的库函数就可以了。
创新互联主要从事网站设计、网站制作、网页设计、企业做网站、公司建网站等业务。立足成都服务泊头,10多年网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:18980820575
注:1、linux系统包括linux kernel、glibc库等。
2、因为应用程序调用系统调用是通过汇编指令完成的,所以才有了glibc的封装,简化了应用开发的难度。
kernel中提供的系统调用处理函数
sys_socket、sys_open、sys_close、sys_read、sys_write等
glibc中对应的是
socket、open、close、read、write等
glibc中的socket函数就是调用了int $0x80这条汇编指令,从而使cpu切换到内核态,执行sys_socket这个函数的。
函数调用流程:
socket-int $0x80-sys_socket。
现在2.6版本的内核提供了300多个系统调用:
glibc的下载地址:
linux kernel的下载地址:
UNIX是和C共生的,linux 是Unix的某种变体
早期的C库,基本就是unix 系统调用,和一些常用函数库(数学库,字符串库等等)。
后来C因为可移植性好,广泛流传,DOS 上就有四大编译器。
由于,广泛流传,所以后来为了统一和可移植性,就制定了标准。
某些库函数,被标准化了,成了标准库的一部分,另一些没有。
标准化的这一部分,就可以用于任何执行标准的编译器,包括DOS和Windows 上的.
没标准化的部分,只能是unix,linux 专用,其他操作系统上的编译器,也有可能部分自己专用库,或者该操作系统专用库
而操作系统,年最核心功能部分的库函数,unix,linux 就是系统调用(听说是X86 上是 int 80中断啥的)。
DOS是 int21中断,Windows 是API,SDK,DDK等。
有些系统调用,和API 被封装到标准库了,有些没有。
方式一:
1.
将该
C++
库
通过
g++
编译成
.a
文件
2.
然后将该
.a
文件再次封装成一个
gcc
编译的
.a
3.
然后再去我的主程序中调用,报错,其中有相关的
C++
部分无法引出
方式二:
1.
将该
C++
库,通过
g++
编译成
.so
文件
2.
然后将该
.so
再次封装,通过
dlopen,
dlsym,dlclose
等封装
3.
然后在主程序中,调用第二次封装的.so,报
dlopen
失败,其中同样报出相关的
C++
函数名无法定位。
api 是个通用的名字,Windows有Windows的api,linux有linux 的api,api就是一些函数接口,由别人帮你实现了一些功能,你需要调用就可以了,MFC内部确实调用了Windows的api函数来实现一些功能,只不过MFC把这些函数封装成了类了,让你用起来更方便了。。。