进程笔记

多进程编程:


程序概念:资源与代码文件的有序集合。
进程概念:进程是一个抽象实体,它是程序的一次执行过程。


进程与程序的区别:
1、进程是动态的
   程序是静态的


2、进程是运行于内存中
   程序是存储在磁盘中


3、进程有唯一识别码  pid
   程序有唯一识别码  inode


进程和程序的分类:
1、程序的分类:  可执行程序   不可执行程序
2、进程的分类:  交互式进程    批处理进程   守护进程


所有进程都有自己的生命周期,在生命周期过程中会有各种状态:


==》状态: 运行态  等待态(可中断)  等待态(不可中断)
  停止态  僵尸态


==》查看: ps aux ===>STAT列
S  ===> 可中断的等待态
R  ===> 运行态
D  ===> 不可中断的等待态
T  ===> 停止态
Z  ===> 僵尸态  ====》以上5种状态进程某时刻只能处于一种态




s  ===> 会话组长
N  ===> 低优先级
<  ===> 高优先级
l  ===> 多线程
+  ===> 前台运行




进程的运行前后台控制。
./a.out 程序默认处于前台运行
./a.out & 程序转为后台执行


前后台切换; jobs  fg   bg


jobs 命令用于查看当前终端中运行的进程任务列表


fg 命令可以将一个后台运行的进程直接调整到前台运行


bg 命令可以将一个前台程序转换为后台运行。
   注意:一般要先将进程挂起(ctrl+z),释放操作终端。

1、jobs的作用是什么?其他终端是否有效?
前后台切换命令,只能在同一个终端中有效。
且任务来自 jobs 查看的目标


2、如果有多个进程同时后台,如何选择某个进程前台?
可以使用任务编号+ 命令调整任意指定进程前后台切换
如果直接在多个任务中执行默认命令则任务编号带+ 优先执行。


fg xx
bg xx
fg   ==>+
bg   ==>+




进程控制命令: kill  ===》杀死进程 ===》进程间通信


kill命令可以向指定进程发送信号;
使用kill命令完成进程间通信的框架:


kill -num  pid


kill  当前系统中已经安装的程序,kill启动的时候属于kill进程


-num  所有的系统预定义的信号列表,可以通过 kill -l 查看
 num 可以是信号的编号也可以是信号的宏名称


pid  当前系统中正在运行的目标进程的pid号




1- 64号信号:1 -31 系统已经预制的有具体含义的信号。大多数会杀死进程
34-64 系统尚未赋值含义的信号。




kill -19 pid == kill -SIGSTOP pid == ctrl+z
kill -18 pid == kill -SIGCONT pid
kill -9  pid == kill -SIGKILL pid == 一定会杀死进程
kill -2  pid == kill -SIGINT  pid == ctrl+c
kill -3  pid == kill -SIGQUIT pid == ctrl+\
kill  pid    == kill -SIGTERM pid == kill -15 pid 


killall -9  a.out  
pkill -kill -t  pts/2
pkill -kill -U  cqb




ssh  [email protected] 


write cqb pts/5 


======================================================================
多进程编程 ===》fork函数


#include <unistd.h>


pid_t fork(void);
功能:该函数可以动态生成一个同名子进程;ps -ef 
 父子进程具有相同的逻辑和空间,类似克隆体程序;
 父子进程都可以独自按照自己逻辑执行,区别依据是 pid;
 
 父子进程执行的位置不同,子进程永远从fork函数之后执行;
 父进程的fork返回值就是子进程的pid号,而子进程中fork的
 返回值 == 0;
 父子进程都具有各自的独立4G内存空间。


参数:无
返回值:成功 
pid_t >0 类型的子进程pid号
pid_t == 0;  子进程
失败 pid_t <0 ;异常




进程获取自身信息:
pid = getpid(); 获取自己的pid号
ppid =getppid();获取自己父亲的pid号


面试题:
如果有两个连续fork函数执行,会生成几个子进程?
他们之间的关系如何使用人类家族图谱形式表示?
有几个父进程 子进程 兄弟进程 孙子进程?




思考题:
如何生成10个子进程并让没给子进程执行不同的逻辑?


for(i=0;i<10;i++)
{
pid = fork();
if(pid == 0)
{
test(i); ///子进程不退出
}
}
while(1)
{
sleep(1);
}


扩展:
如何将以上代码修改,并能证明10个子进程在并发执行?




作业:
设计一个父子进程,提示用户任意输入,父进程将用户输入写入
文件,子进程实时打印文件内容,当输入"quit"双方退出。

猜你喜欢

转载自blog.csdn.net/flying_man_/article/details/79089440
今日推荐