需要了解的命令
命令 |
解释 |
pmap |
用来查看进程空间信息 |
strace |
查看进程调用过程 |
cat /proc/[pid]/maps |
查看进程地址空间机制 |
参考的学习视频
静态链接和动态链接的概念
动态链接是指在生成可执行文件时不将所有程序用到的函数链接到一个文件,因为有许多函数在操作系统带的dll文件中,当程序运行时直接从操作系统中找。
而静态链接就是把所有用到的函数全部链接到exe文件中。
动态链接的好处
- 共享内存
- 独立升级组件(插件)
- 可以显示动态加载
如果升级可能造成部分程序不能运行dll hell
在linux中,我们可以用 file
命令来查看 是否为静态链接或者动态链接,比如
1
2
3
|
gcc -static main.c
file ./a.out
# 上面 我采用 静态链接的方式编译出 a.out 文件,然后
|
进程间通信的几种方式
- 管道pipe:管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。
- 命名管道FIFO:有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。
消息队列MessageQueue:消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
- 共享存储SharedMemory:共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号量,配合使用,来实现进程间的同步和通信。
- 信号量Semaphore:信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
套接字Socket:套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同及其间的进程通信。
- 信号 ( sinal ) : 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。
- 套接字: socket
系统会发送一个SIGTERM的信号给对应的程序。当程序接收到该signal后,将会发生以下的事情
-
程序立刻停止
-
当程序释放相应资源后再停止
-
程序可能仍然继续运行
大部分程序接收到SIGTERM信号后,会先释放自己的资源,然后在停止。但是也有程序可以在接受到信号量后,做一些其他的事情,并且这些事情是可以
配置的。如果程序正在等待IO,可能就不会立马做出相应。
也就是说,SIGTERM多半是会被阻塞的、忽略。
信号跟信号量虽然名字相似度 66.66%,但两者用途完全不一样,就好像 Java 和 JavaScript 的区别。
在 Linux 操作系统中, 为了响应各种各样的事件,提供了几十种信号,分别代表不同的意义。我们可以通过 kill -l 命令,查看所有的信号。
运行在 shell 终端的进程,我们可以通过键盘输入某些组合键的时候,给进程发送信号。例如
Ctrl+C 产生 $ SIGINT $ 信号,表示终止该进程;
Ctrl+Z 产生 $ SIGTSTP $ 信号,表示停止该进程,但还未结束;
如果进程在后台运行,可以通过 kill 命令的方式给进程发送信号,但前提需要知道运行中的进程 PID 号,例如:
kill -9 1050 ,表示给 PID 为 1050 的进程发送 SIGKILL 信号,用来立即结束该进程;
socket 概念
- socket 有很多个意思 ,本意就是 端到端的一个连接, 但是 linux 中的socket 和 这个 socket 不是一个意思 【 linux 中 进程 基于socket 的通信 ,这个 socket 不是走的网络协议的,而是走文件系统实现的socket通信】
- 操作系统中有提到 socket 是用来进程间通信的,它和通常说 的 tcp/ip 的 socket 的概念十分相似,代表操作系统中传输数据的两方,只是 它不再基于网络协议,而是操作系统本身的文件系统
- 网络中 的socket 原理: 是指 操作系统中 提供的对于传输层 (TCP/UDP) 抽象的接口。 现行的socket API 大致都是经循了 BSD socket规范 (包括 windows)。 这里称规范其实不太准确, 规范其实是 POSIX ,但 BSD unix 对于 socket 的实现被广为使用,所以成为了实际的规范。 如果你使用
文件描述符
ls /proc/pid/fd
查看文件描述符
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
[root@VM-0-7-centos ~]# ps -ef|grep main2
root 13357 1 0 Oct01 ? 00:00:10 ./main2
root 28066 27903 0 15:02 pts/3 00:00:00 grep --color=auto main2
[root@VM-0-7-centos ~]# ls /proc/133
1333/ 13357/ 1336/
[root@VM-0-7-centos ~]# ls /proc/13357/
attr clear_refs cpuset fd limits mem net oom_score personality schedstat stack syscall wchan
autogroup cmdline cwd fdinfo loginuid mountinfo ns oom_score_adj projid_map sessionid stat task
auxv comm environ gid_map map_files mounts numa_maps pagemap root setgroups statm timers
cgroup coredump_filter exe io maps mountstats oom_adj patch_state sched smaps status uid_map
[root@VM-0-7-centos ~]# ls /proc/13357/fd
fd/ fdinfo/
[root@VM-0-7-centos ~]# ls /proc/13357/fd/
0 1 10 11 12 13 14 15 17 2 3 4 5 6 7 8 9
[root@VM-0-7-centos ~]# ls /proc/13357/fd/
0 1 10 11 12 13 14 15 17 2 3 4 5 6 7 8 9
[root@VM-0-7-centos ~]#
[root@VM-0-7-centos ~]# ls /proc/13357/fd/ -l
total 0
lr-x------ 1 root root 64 Oct 6 13:31 0 -> /dev/null
l-wx------ 1 root root 64 Oct 6 13:31 1 -> /root/cet6_learn/nohup.out
lrwx------ 1 root root 64 Oct 6 13:31 10 -> socket:[361944889]
lrwx------ 1 root root 64 Oct 6 13:31 11 -> socket:[307931949]
lrwx------ 1 root root 64 Oct 6 13:31 12 -> socket:[361944891]
lrwx------ 1 root root 64 Oct 6 13:31 13 -> socket:[361944893]
lrwx------ 1 root root 64 Oct 6 13:31 14 -> socket:[361944895]
lrwx------ 1 root root 64 Oct 6 13:31 15 -> socket:[361944897]
lrwx------ 1 root root 64 Oct 6 13:31 17 -> socket:[361944904]
l-wx------ 1 root root 64 Oct 6 13:31 2 -> /root/cet6_learn/nohup.out
lr-x------ 1 root root 64 Oct 6 13:31 3 -> anon_inode:inotify
lrwx------ 1 root root 64 Oct 6 13:31 4 -> anon_inode:[eventpoll]
lr-x------ 1 root root 64 Oct 6 13:31 5 -> pipe:[307931942]
l-wx------ 1 root root 64 Oct 6 13:31 6 -> pipe:[307931942]
lrwx------ 1 root root 64 Oct 6 13:31 7 -> anon_inode:[eventpoll]
lr-x------ 1 root root 64 Oct 6 13:31 8 -> pipe:[307931943]
l-wx------ 1 root root 64 Oct 6 13:31 9 -> pipe:[307931943]
[root@VM-0-7-centos ~]#
# 这个 是 一个 golang 的项目
[root@VM-0-7-centos ~]# cat /root/cet6_learn/deploy.sh
kill -9 $(lsof -i:8088 -t)
cp ./main ./main2
sudo chmod +x main2
nohup ./main2 &
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
[root@VM-0-7-centos ~]# ls /proc/3203/fd -l
total 0
lr-x------ 1 root root 64 Oct 6 13:31 0 -> /dev/null
l-wx------ 1 root root 64 Oct 6 13:31 1 -> /root/blog4_backend/nohup.out
lr-x------ 1 root root 64 Oct 6 13:31 10 -> /dev/random
lr-x------ 1 root root 64 Oct 6 13:31 11 -> /dev/urandom
lr-x------ 1 root root 64 Oct 6 13:31 16 -> /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.302.b08-0.el7_9.x86_64/jre/lib/ext/sunec.jar
lr-x------ 1 root root 64 Oct 6 13:31 17 -> /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.302.b08-0.el7_9.x86_64/jre/lib/ext/sunjce_provider.jar
lr-x------ 1 root root 64 Oct 6 13:31 18 -> /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.302.b08-0.el7_9.x86_64/jre/lib/charsets.jar
lr-x------ 1 root root 64 Oct 6 13:31 19 -> pipe:[41166]
l-wx------ 1 root root 64 Oct 6 13:31 2 -> /root/blog4_backend/nohup.out
lrwx------ 1 root root 64 Oct 6 13:31 65 -> anon_inode:[eventpoll]
lr-x------ 1 root root 64 Oct 6 13:31 7 -> /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.302.b08-0.el7_9.x86_64/jre/lib/resources.jar
lr-x------ 1 root root 64 Oct 6 13:31 8 -> /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.302.b08-0.el7_9.x86_64/jre/lib/jce.jarlr-x------ 1 root root 64 Oct 6 13:31 9 -> /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.302.b08-0.el7_9.x86_64/jre/lib/jsse.jar
|
1
2
3
4
5
6
|
[root@VM-0-7-centos ~]# ll /proc/$$/fd
total 0
lrwx------ 1 root root 64 Oct 6 15:02 0 -> /dev/pts/3
lrwx------ 1 root root 64 Oct 6 15:02 1 -> /dev/pts/3
lrwx------ 1 root root 64 Oct 6 15:02 2 -> /dev/pts/3
lrwx------ 1 root root 64 Oct 6 15:07 255 -> /dev/pts/3
|
文件重定向
推荐使用 案例4
管道
学习视频
TEE 管道
1
2
|
ip addr | grep 'inet' | tee -a ip.txt
# 追加方式
|