glibc的了解,对内核的封装

glibc除了提供最底层的C运行库,还封装了kernel提供的API,程序通过glibc进行系统调用( syscall)。

应用层面的C库,比如OpenSSL库: 
/usr/include/openssl

比如函数SSL_set_session
查看手册 man SSL_set_session
引入头文件 #include <openssl/ssl.h>

标准C库,比如stdio库: 
/usr/include/stdio.h 
比如函数fprintf: 
查看手册  man fprintf
引入头文件 #include <stdio.h>

Linux系统调用,比如epoll:
/usr/include/x86_64-linux-gnu/sys/ epoll.h
比如函数epoll_wait
查看手册 man epoll_wait
引入头文件 #include <sys/epoll.h>

使用strace更直观地查看程序进程进行的系统调用:

比如追踪Nginx的工作进程(假设其PID为1185)响应以下请求进行的系统调用:
curl -I http://127.0.0.1/
生成报告:sudo strace -Tcp 1185

?


1

2

3

4

5

6

7

8

9

10

11

12

% time     seconds  usecs/call     calls    errors syscall

------ ----------- ----------- --------- --------- ----------------

  -nan    0.000000           0         1           write

  -nan    0.000000           0         1           close

  -nan    0.000000           0         1           writev

  -nan    0.000000           0         3         1 recvfrom

  -nan    0.000000           0         1           shutdown

  -nan    0.000000           0         3           epoll_wait

  -nan    0.000000           0         1           epoll_ctl

  -nan    0.000000           0         1           accept4

------ ----------- ----------- --------- --------- ----------------

100.00    0.000000                    12         1 total

实时检测:sudo strace -Tp 1185

?


1

2

3

4

5

6

7

8

9

10

11

12

13

epoll_wait(13, {{EPOLLIN, {u32=18104944, u64=18104944}}}, 512, 4294967295) = 1 <3.288133>

accept4(10, {sa_family=AF_INET, sin_port=htons(56261), sin_addr=inet_addr("127.0.0.1")}, [16], SOCK_NONBLOCK) = 3 <0.000037>

epoll_ctl(13, EPOLL_CTL_ADD, 3, {EPOLLIN|EPOLLET|0x2000, {u32=18105545, u64=18105545}}) = 0 <0.000024>

epoll_wait(13, {{EPOLLIN, {u32=18105545, u64=18105545}}}, 512, 60000) = 1 <0.000057>

recvfrom(3, "HEAD / HTTP/1.1\r\nUser-Agent: cur"..., 1024, 0, NULL, NULL) = 162 <0.000057>

writev(3, [{"HTTP/1.1 400 Bad Request\r\nServer"..., 157}], 1) = 157 <0.000106>

shutdown(3, 1 /* send */)               = 0 <0.000082>

recvfrom(3, 0x7fff07f92f10, 4096, 0, 0, 0) = -1 EAGAIN (Resource temporarily unavailable) <0.000023>

epoll_wait(13, {{EPOLLIN|EPOLLHUP|0x2000, {u32=18105545, u64=18105545}}}, 512, 5000) = 1 <0.000039>

recvfrom(3, "", 4096, 0, NULL, NULL)    = 0 <0.000021>

write(8, "127.0.0.1 - - [14/Feb/2014:17:24"..., 173) = 173 <0.000055>

close(3)                                = 0 <0.000030>

epoll_wait(13,

注意:跟踪会使进程的运行效率明显下降。

时间: 2024-08-08 11:06:30

glibc的了解,对内核的封装的相关文章

linux 用户态 内核态

http://blog.chinaunix.net/uid-1829236-id-3182279.html 究竟什么是用户态,什么是内核态,这两个基本概念以前一直理解得不是很清楚,根本原因个人觉得是在于因为大部分时候我们在写程序时关注的重点和着眼的角度放在了实现的功能和代码的逻辑性上,先看一个例子: 1)例子 C代码 1.     void testfork(){   2.     if(0 = = fork()){   3.     printf(“create new process suc

基于wke封装的duilib的webkit浏览器控件,可以c++与js互交,源码及demo下载地址

转载请说明原出处,谢谢~~ 前些日子用wke内核封装了duilib的webkit浏览器控件,好多群里朋友私聊我希望可以我公布源码,今天把这个控件的源码和使用demo公布.其实这个控件封装起来没什么难度,我只是按照原来作者的demo,把相应的消息封装成duilib对应的. 在此首先要感谢wke内核的作者BlzFans以及soui2界面库的作者flyhigh,BlzFans精简了webkit内核后封装为wke并公布了源码,flyhigh对wke进行处理让他更容易移植到dui工程中.wke内核10M大

深入探究文件I/O

读本文章前,必须先有一些通过I/O模型的系统调用的基础,即 open() , create() , read() , write() , close() , lseek() 函数的调用. 原子操作 在文件读写中,很容易有多个进程读取同一文件的情况,这时候竞争状态便不可避免.文件I/O的函数提供的一些参数配合系统调用的原子性很好的解决了这个问题. 来看一个关于竞争创建者的例子: int main(int argc, char *argv[]) { int fd; fd = open(argv[1]

NPTL分析之线程的创建

NPTL(NativePosix Thread Library) NPTL包括pthread线程库以及配套的同步方法,我们这里暂时只讲pthread线程库的实现. 1. NPTL的起源 在NPTL之前,linux的线程库是LinuxThreads,该库部分实现了Posixthreads的规范.其主要特点是线程的调度在用户态完成,且由一个管理线程来调度.相应的,其缺点也来自于这种架构,导致管理线程带来了很大的任务切换的开销.另外一个问题是LinuxThreads对信号的处理不满足Posixthre

Linux IO模型与Java NIO

概述看Java NIO一篇文章的时候又看到了"异步非阻塞"这个概念,一直处于似懂非懂的状态,想解释下到底什么是异步 什么是非阻塞,感觉抓不住重点.决定仔细研究一下.本文试图研究以下问题: web server原理,bio的connector与nio的connector在架构上到底什么区别? NIO的优势到底在哪里,是如何应用到实践中的? 同步/异步.阻塞/非阻塞到底是什么概念,引出的IO模型同步阻塞.同步非阻塞.异步阻塞.异步非阻塞的具体使用场景,适用的场景是怎样的? bio nio也

Linux整理

FORMAT  格式.版本.开本        mandatory 强制的,托管的,命令的 authentication 证明 鉴定 身份认证   expire[正式文件]到期.过期.失效 specify 具体指明,详尽  multiplier 乘数,倍增器suffix下标,后缀 device 设备,仪器,装置     omit省略,遗漏,删除 conf 配置 -------------------------华丽分割线------------------------------ ##10.26

linux 学习拾缀

这段时间学习python的同时又回头学了下linux了,主要是看视频教程,基于RHEL6学了不少东西,总结记录下,以免过段时间又忘了.持之以恒! 一.学习linux最好用文本命令界面,了解相关命令使用,了解linux的系统结构 application     client  *.com(直接操作硬件)  shell(客户端通过shell调用系统API) API     GLIBC库 api kernel内核  modules         BIOS 硬件层 CPU RAM 磁盘 切换shell

CentOS 5.4 final下Systemtap的安装

CentOS 5.4 final下Systemtap的安装 时间:2015-02-11来源:linux网站 作者:zklth 一.Systemtap运行环境需求   (1)linux kernel with kprobes (mainline 2.6.11+ or backport):   (2)kernel module build environment (kernel-devel or kernel-smp-devel rpm):   (3)kernel debugging informa

STM32之系统滴答定时器

一.SysTick(系统滴答定时器)概述 操作系统需要一个滴答定时器周期性产生中断,以产生系统运行的节拍.在中断服务程序里,基于优先级调度的操作系统会根据进程优先级切换任务,基于时间片轮转系统会根据时间片切换任务.总之,滴答定时器是一个操作系统的"心跳". Cortex-M3在内核部分封装了一个滴答定时器--SysTick,在之前的ARM内核通常是不会把定时器做进内核,定时器都是SOC厂商自己制作的外设.显然,Cortex-M3封装了这么一个定时器,对于将操作系统移植到不同SOC厂商生