内容简介
在Linux下的进程管理。包括创建进程、查看进程、杀死进程。
创建进程
创建新进程主要是使用fork()函数,其主要特性如下:
-
fork创建一个进程时,子进程只是完全复制父进程的资源,复制出来的子进程有自己的task_struct结构和pid,但却复制父进程其它所有的资源。
-
现在Linux中是采取了copy-on-write(COW写时复制)技术,为了降低开销,fork最初并不会真的产生两个不同的拷贝,因为在那个时候,大量的数据其实完全是一样的。写时复制是在推迟真正的数据拷贝。若后来确实发生了写入,那意味着parent和child的数据不一致了,于是产生复制动作,每个进程拿到属于自己的那一份,这样就可以降低系统调用的开销。
-
fork()调用执行一次返回两个值,对于父进程,fork函数返回子程序的进程号,而对于子程序,fork函数则返回零,这就是一个函数返回两次的本质。
-
在父进程中,fork返回新创建子进程的进程ID;
-
在子进程中,fork返回0;
-
如果出现错误,fork返回一个负值;
创建新进程的代码如下:
我的程序名称为test,所以fork之后会有两个test.我们调用进程显示来查看当前是否有两个进程:
查看运行的进程
- 显示所有运行中的进程:ps aux | less
- 查看系统中的每个进程:ps -A
- 查看非root运行的进程:ps -U root -u root -N
- 查看用户budding运行的进程:ps -u budding
- 查看运行中系统的动态实时视图:top
- 显示进程树
显示所有运行中的进程:ps aux | less
ps- A 可以列出所有进程:
ps -u user 可以显示当前用户进程
ps - U root -u root -N 查看非root运行的进程
查看运行中系统的动态实时视图:top
显示所有运行中的进程:ps aux | less
查找某个进程的显示
使用的命令:pgrep firefox 返回进程ID
注:Markmyword: 是当前在运行的一个笔记软件。用于markdown的书写。
显示进程树:pstree
换出某个进程
有6种以exec开头的替换函数,统称为exec函数。
#include<unistd.h>
int execl(const char* path,const char* arg,...); //后面以NULL结束
int execlp(const char* file,const char* arg,...);
int execle(const char* path,const char* grg,...,char* const envp[]);
int execv(const char* path,const char* argv); //argv数组也要以NULL结束
int execvp(const char* file,const char* argv);
int execve(const char* path,const char* argv,char* const envp[]); //envp数组也是NULL结束
//事实上,只有execve是系统调用,其它函数都调用了execve
注:该终端不支持中文,固只使用在了部分实验中使用到了此终端,在后期的实验均采用支持中文输出的终端(原生终端)。
杀死某个进程
杀死进程主要是用kill + 进程号 命令。
使用kill命令kill test 进程:
Test进程是不断显示hello world,在突然被kill之后其显示如下:
再次列出当前运行的进程,可以看到test已经消失。