如何查看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
waI/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命令源代码和函数源代码的主要内容,如果未能解决你的问题,请参考以下文章

如何查看log日志文件

如何查看当前Ubuntu系统的版本

如何查看log日志文件呢?

如何查看一个DLL文件中具体的函数及其代码?

如何查看linux上的历史执行命令

如何使用vim的插件Ctags查看Linux源码