如何查看linux命令源代码和函数源代码
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何查看linux命令源代码和函数源代码相关的知识,希望对你有一定的参考价值。
1. 以搜索ls命令源码为例,先搜索命令所在包,命令如下:lpj@lpj-linux:~$ which ls
/bin/ls
2. 用命令搜索该软件所在包,代码如下:
lpj@lpj-linux:~$ dpkg -S /bin/ls
coreutils: /bin/ls
3. 从上一步中可以知道ls命令的实现在包coreutils中,用apt安装(说安装有些歧义,主要是区分apt-get -d)该包的源代码然后解压,代码如下:
sudo apt-get source coreutils
cd /usr/src/coreutils-XXX #XXX表示版本号
sudo tar zxvf coreutils-XXX.tar.gz
或者只下载源码,然后手动打补丁再解压,代码如下:
sudo apt-get -d source coreutils
cd /usr/src
tar zxvf coreutils-XXX.tar.gz
gzip -d coreutils-XXX.diff.gz #这一步会生成coreutils-XXX.diff文件
patch -p0 < coreutils-XXX.diff
cd coreutils-XXX
tar zxvf coreutils-XXX.tar.gz
OK,这几步执行完后,就可以进入/usr/src/coreutils-XXX/coreutils-XXX/src中查看各命令对应的源代码了 参考技术A linux 系统都是由开源代码组成的,可以自己下载开源代码,常用网站是
gnu.org
kernel.org
比如你想看 ls 命令的源码, 先看下ls的来源, man ls 手册最底部就是, 比如来自
coreutils 那你就去 ftp://ftp.gnu.org/pub/gnu/coreutils/coreutils-8.29.tar.xz
下载源码看,解压后 一般在src 里,有 ls.c ls.h等
然后可以制作些代码导航,比如 ctags, cscope 然后搭配vim, emacs 跳转阅读
比如 tags 文件的生成
find . -name "*.[ch]" | xargs ctags -R > tags
进入vim 后设置 tags
se tags=tags\;
cscope 文件的生成
find . -name "*.[ch]" >> cscope.files
cscope -b
cscope -d
自己多查查吧 你也可以在windows下看,都行的
Linux进程管理
程序和进程的关系
程序
保存在硬盘、光盘等介质中的可执行代码和数据
静态保存的代码
进程
在CPU及内存中运行的程序代码
动态执行的代码
查看进程
查看静态的进程统计信息
PS命令是linux系统中最常用的进程查看工具
通过不同的命令选项,可以有选择性地查看进程信息
a:显示当前终端下所有进程信息
u:是用以用户为主的格式输出进程信息
x:显示当前用户在所有终端下的进程信息
-e:显示系统内的所有进程信息
-l: 使用长格式显示进程信息
-f:使用完整的格式显示进程信息
-o:指定输出字段
固定用法1 ps aux 以简单列表的形式显示进程信息
[root@localhost ~]# ps aux |head -n 2
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 199608 4500 ? Ss 07:21 0:03 /usr/lib/systemd/
USER: 启动该进程的用户账号信息
PID: 该进程在系统中的数字ID号,在当前系统中是唯一的
%CPU:CPU占用的百分比
%MEM:内存占用的百分比
VSZ:占用虚拟内存(SWAP)的大小
RSS:占用常驻内存(物理内存)的大小
TTY: 表明该进程在哪个终端上运行。“?”表示未知或者不需要终端
SATA: 显示了进程当前的状态,如S(休眠),R(运行),Z(僵死),<(高优先级),N(低优先级),s(父进程),+(前台进程),l(多线性进程),D(不可休眠进程)对处于僵死状态的进程应该予以手动终止
START: 启动该进程的时间
TIME: 该进程占用CPU时间
COMMAND: 启动该进程的命令的名称
固定用法2 ps -elf 以长格式显示系统中的进程信息
[root@localhost ~]# ps -elf | head -n 2
F S UID PID PPID C PRI NI ADDR SZ WCHAN STIME TTY TIME CMD
4 S root 1 0 0 80 0 - 49902 ep_pol 07:21 ? 00:00:03 /usr/lib/systemd/systemd
PPID:表示对应进程的父进程的PID号
PRI:用户态优先级
NI: nice值,内核态优先级,取值范围(-20~19),值越小,优先级越高
ADDR:若是 - ,代表正在运行
SZ:在swap交换分区的容量
WCHAN:当前进程在内核中的名称
STIME:启动时间
查看进程动态信息
top命令会在当前终端以全屏交互式的界面进程排名,默认每三秒刷新一次
[root@localhost ~]# top | head -n 8
top - 14:21:46 up 7:00, 4 users, load average: 0.00, 0.01, 0.05
Tasks: 210 total, 1 running, 209 sleeping, 0 stopped, 0 zombie
%Cpu(s): 1.6 us, 0.0 sy, 0.0 ni, 98.4 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 3861280 total, 2339976 free, 606588 used, 914716 buff/cache
KiB Swap: 4063228 total, 4063228 free, 0 used. 2985524 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 199608 4500 2664 S 0.0 0.1 0:03.15 systemd
第1行是任务队列信息
14:21:46 | 系统当前时间 |
---|---|
up 7:00 | 系统运行时间 |
4 users | 当前登录用户数 |
load average: 0.00, 0.01, 0.05 | 系统负载,即任务队列的平均长度。 三个数值分别为 1分钟、5分钟、15分钟前到现在的平均值 |
第2行是系统任务信息
total | 总进程数 |
---|---|
running | 正在运行的进程数 |
sleeping | 休眠的进程数 |
stopped | 中止的进程数 |
zombie | 僵死无响应的进程数 |
第3行是CPU占用信息
us | 用户占用 |
---|---|
sy | 内核占用 |
ni | 优先级调度占用 |
id | 空闲cpu |
wa | I/O等待占用 |
hi | 硬件中断占用 |
si | 软件中断占用 |
st | 虚拟化占用 |
第4行是内存(mem)占用信息
total | 总内存空间 |
---|---|
free | 空闲内存 |
used | 已用内存 |
buff/cache | 用作内核缓存的内存量 |
第5行是交换空间(swap)占用信息
total | 总交换空间 |
---|---|
free | 空闲交换空间 |
used | 已用交换空间 |
avail mem | 代表可用于进程下一次分配的物理内存数量 |
查询进程信息
pgrep命令是用来查询特定进程信息的专用工具
-l 输出对应的进程名,否则只输出PID号
-U 查询特定用户的进程
[root@localhost ~]# pgrep -l -U root vim
8945 vim
查看进程树
pstree命令可以输出Linux系统中各进程的树形结构,更加直观地判断出各进程之间的相互关系
-p 同时列出对应的pid号
[root@localhost ~]# pstree -p
systemd(1)─┬─ModemManager(792)─┬─{ModemManager}(798)
│ └─{ModemManager}(801)
├─VGAuthService(831)
├─abrt-watch-log(839)
├─abrt-watch-log(843)
├─abrtd(837)
控制进程
启动进程
1)手工启动进程
由用户手工输入命令或者可执行程序的路径,可以至少启动一个进程
[root@localhost ~]# systemctl start firewalld.service //启动防火墙
2)调度启动进程
通过指定任务运行时间来执行任务,调度启动的计划任务进程均在后台运行
[root@localhost ~]# at 5pm //下午五点重启网络服务
at> systemctl restart network
at> <EOT>
job 1 at Fri May 14 17:00:00 2021
[root@localhost ~]#
改变进程的运行方式
1)将进程放到后台运行
[root@localhost ~]# vim 12 &
[3] 9319
2)挂起当前的进程 (Ctrl + Z组合键)
[root@localhost ~]# yum -y install samba
已加载插件:fastestmirror, langpacks
/var/run/yum.pid 已被锁定,PID 为 9292 的另一个程序正在运行。
Another app is currently holding the yum lock; waiting for it to exit...
另一个应用程序是:yum
内存:106 M RSS (437 MB VSZ)
已启动: Fri May 14 15:12:38 2021 - 00:49之前
状态 :跟踪/停止,进程ID:9292
^Z
[2]+ 已停止 yum -y install samba
[root@localhost ~]#
3)查看后台的进程并显示进程号
[root@localhost ~]# jobs -l
[1] 9292 停止 yum -y install samba
[2]- 9302 停止 yum -y install samba
[3]+ 9319 停止 (tty 输出) vim 12
[root@localhost ~]#
4)将后台的进程恢复运行
使用bg命令可将后台中暂停执行的任务恢复运行,执行在后台执行操作
使用fg命令可以将后台任务恢复到前台运行
终止进程执行
1)使用kill命令终止进程 (结合-9 选项可强行终止进程)
[root@localhost ~]# pgrep -l firewalld //查询目标进程的pid
9124 firewalld
[root@localhost ~]# kill 9124 //终止指定pid的进程
[root@localhost ~]# pgrep -l firewalld //确认进程已终止
[root@localhost ~]#
2)使用killall命令终止进程 (终止同名进程)
[root@localhost ~]# jobs -l
[3] 9319 停止 (tty 输出) vim 12
[4] 9449 停止 (tty 输出) vim 123
[5]- 9597 停止 vim 123
[root@localhost ~]# killall -9 vim
[3] 已杀死 vim 12
[4] 已杀死 vim 123
[5]- 已杀死 vim 123
3)使用pkill命令终止进程 (与kill类似,但是后跟进程名)
[root@localhost ~]# systemctl start firewalld
[root@localhost ~]# pkill -9 firewalld
[root@localhost ~]# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
Active: failed (Result: signal) since 五 2021-05-14 15:32:23 CST; 7s ago
Docs: man:firewalld(1)
Process: 9661 ExecStart=/usr/sbin/firewalld --nofork --nopid $FIREWALLD_ARGS (code=killed, signal=KILL)
Main PID: 9661 (code=killed, signal=KILL)
5月 14 15:32:08 localhost.localdomain systemd[1]: Starting firewalld - dynamic....
5月 14 15:32:09 localhost.localdomain systemd[1]: Started firewalld - dynamic ....
5月 14 15:32:10 localhost.localdomain firewalld[9661]: WARNING: AllowZoneDrifti...
5月 14 15:32:23 localhost.localdomain systemd[1]: firewalld.service: main proc...L
5月 14 15:32:23 localhost.localdomain systemd[1]: Unit firewalld.service enter....
5月 14 15:32:23 localhost.localdomain systemd[1]: firewalld.service failed.
Hint: Some lines were ellipsized, use -l to show in full.
[root@localhost ~]#
以上是关于如何查看linux命令源代码和函数源代码的主要内容,如果未能解决你的问题,请参考以下文章