欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

Linux 学习系统编程:ps 和 kill 命令以及父进程和子进程之间的数据共享模式

最编程 2024-07-04 07:17:50
...

一、ps 和 kill 命令

1、ps 命令

常用方式:
ps aux :查看正在运行进程信息(主要查 pid)。
ps ajx :更加详细(PID、 PPID:父进程 id、 PGID:进程组 id、 SID:会话 di)。
一般过滤使用: ps aux | grep 关键字 。
例如: ps aux | grep a.out。
注意:有时会出现 2 个进程,第一个是进程我们要查询的,第二个进程是 grep 进程。

2、kill 命令

kill 命令主要用于发信号给某个进程。
查看信号:kill -l
注意:一般只研究 1-31 个信号,因为 34-64 很多是给系统预留的,而且不同操作系统可能存在不同行为(没有 32 和 33) 。
杀死某个进程:
kill -9 pid或 kill -SIGKILL pid ,其中SIGKILL 是一个宏 等于 9。

二、父子进程间数据共享模式

在上篇中说过fork() 后,其实是拷贝父进程内容给子进程(只有进程 pid 不同)。
(1)数据:刚创建子进程时,父子用户区数据完全相同,但父子后续各自进行不同操作,互不影响,各个进程的数据是完全独立的。
原理剖析:进程运行时候,所有的计算都是在物理内存中的,父子进程“虚拟地址空间用户区中的数据”都会通过 MMU 映射到物理内存。
父子进程的数据都会映射到内存中,此时在内存中只有1份数据,早期 Linux 系统设计是两份,但那种设计太浪费内存空间。那么这时就有个问题,如何实现父子进程的数据独立呢?
方法就是读时共享,写时复制。
父子进程不能通过全局变量进行通信,因为是父子的全局变量是相互独立的。进程访问的都是各自的经过复制的变量,内存不能共享,无法通信。
(2)PCB 中的文件描述符表、内存映射区
PCB 中的文件描述符表和内存映射区是共享的 。
例如: 父进程先打开一个文件,此时父进程文件描述符表第 3 号位被占用,指向文件,此时fork,子进程会拷贝父进程的文件描述符表,子进程第 3 号也指向该文件,意味着父子进程可以操作同一个文件。
这种设计是父子进程通过 pipe、fifo、内存映射区、套接字等实现父子进程通信的基础。

推荐阅读