LINUX---进程

相关概念

1.什么是程序什么是进程有什么区别

程序是静态的概念gcc xxx.c -o pro
磁盘中生成pro文件叫做程序。
桌面上的软件都叫程序并没有跑起来。跑起来叫进程
进程是程序的一次运行活动程序跑起来了系统中就多了一个进程。

2.如何查看系统中有哪些进程

1.ps或ps -aux 可以查看linux下的所有进程。
如果需要仔细筛选想看的进程可以使用grep过滤。
例如ps -aux|grep init 查找所有带init的进程。
2.用top指令类似windows的任务管理器可以显示相关的CPU 内存。可以用来评估一个程序的CPU占用情况。

3.进程标识符

1.每个进程都有一个非负整数表示唯一的ID叫pid类似身份证。
2.在操作系统中默认pid=0是交换进程的pid.
作用是进程调度。
默认pid=1是init进程。
作用是系统初始化。

程序运行起来时运行的第一个进程就是init进程。

3.编程调用getpid 函数获取自身的进程标识符
getppid获取父进程的进程标识符
在这里插入图片描述

4.父进程子进程

进程a创建了进程ba就是父进程b就是子进程

5.C程序的存储空间是如何分配的

在这里插入图片描述
堆调用malloc等申请空间在这里也就是malooc返回值都在这里
栈保存局部变量等等
高地址那行存放argc,argv那些东西
bss段函数外未被初始化的变量

创建进程函数fork

fork函数调用成功返回两次。
返回值为0代表当前进程是子进程。
返回值非负数代表当前进程为父进程。
在这里插入图片描述
在这里插入图片描述
参考博文

创建子进程的目的
1.父进程复制自己子进程使父子同时执行不同的代码段。常用于网络编程父进程等待客户端的服务请求当请求到达时父进程调用fork使子进程处理此请求父进程则继续等待下一个服务请求到达。

vfork

也可以创建进程和fork的区别
1.vfork直接使用父进程存储空间不拷贝。
2.vfork保证子进程先运行当子进程调用exit退出后父进程才执行

fork创建进程:

在这里插入图片描述
在这里插入图片描述

vfork创建进程

在这里插入图片描述

在这里插入图片描述
上述编译结果证明了vfork保证子进程先运行


在这里插入图片描述

在这里插入图片描述
上述编译结果证明当子进程调用exit退出后父进程才执行

进程退出

正常退出

1.main函数调用return
2.进程调用exit()标准库
3.进程调用_exit()或者_Exit(),属于系统调用。
4.进程最后一个线程返回
5.最后一个线程调用pthread_exit

异常退出

1.调用abort相当于放弃当前进程
2.当进程收到某些信号时入CTRL C
3.最后一个线程对取消cancellation请求做出响应

不管是什么退出内核都会为打开的进程释放存储器关闭打开的描述符。
父进程可以调用wait或waitpid来收集子进程的退出状态

父进程等待子进程退出

1.为什么要等子进程退出?

父进程等待子进程退出原因
创建子进程的目的是让他干活是否干完干完就是正常退出
没干完就是异常退出正常退出有很多种退出码
通过分析退出码来判断子进程的工作情况

1.父进程通过调用wait函数会返回状态码收集退出状态。
2.子进程退出状态不被收集会编程僵尸进程Z+作为了解
在这里插入图片描述

3.使用wait函数时如果没有任何子进程则立即出错返回。

2.wait函数有两种

1.pid_t wait(int *status)

status:状态码是一个整型指针
非空子进程退出状态放在它所指向的地址中
空不关心退出状态。

在这里插入图片描述

在这里插入图片描述
收集状态后如何判断子进程的退出状态用宏

wait所返回的终止状态的宏
WIFEXITEDstatus
若为正常终止子进程返回的状态则为真对于这种情况
可执行WIFEXITEDstatus),取子进程传给exit
_exit或_Exit参数的低8位

WIFSIGNALED(staus)
若为异常终止子进程返回的状态则为真对于这种情况
可执行WTERMSIG(status)取使子进程终止的信号编号。

用法实例
在这里插入图片描述

2.pid_t waitpid(pid_t,int *status,int options)暂时了解

pid参数的作用解释
pid>0 等待其进程ID与pid相等的子进程。常用
pid == -1等待任一子进程。这一方面waitpid=wait
pid == 0 等待其组ID等于调用进程组ID的任一子进程
pid < -1 等待其组ID等于pid绝对值的任一子进程。

wait和waitpid区别
wait使调用者阻塞
waitpid有一个选项可使调用者不阻塞。

孤儿进程

父进程不等待子进程退出在子进程结束前就结束了自己的生命此时子进程叫孤儿进程。
LINUX避免系统有很多孤儿进程init进程收留孤儿进程成为孤儿进程的父进程。

exec族函数

https://blog.csdn.net/u014530704/article/details/73848573
参考博文: https://blog.csdn.net/u014530704/article/details/73848573

简单理解exec:
fork一个进程后程序跑到一半让他执行另外一个程序就调用exec.

小应用写一个程序能调用出系统时间。

1.先使用指令 whereis date 查看date所属路径。
在这里插入图片描述
2.

3.在这里插入图片描述

exec配合fork使用

实现功能
当父进程检测到输入为1时创建子进程把配置文件的字段值修改掉
在这里插入图片描述
changedata是修改程序

system函数

功能同execl

参考博文
exec和system函数区别
system是用shell来调用程序=fork+exec+waitpid而exec是直接让你的程序代替用来的程序运行。
system 是在单独的进程中执行命令完了还会回到你的程序中。而exec函数是直接在你的进程中执行新的程序新的程序会把你的程序覆盖除非调用出错否则你再也回不到exec后面的代码就是说你的程序就变成了exec调用的那个程序了。

popen函数

FILE popenconst char command , const char* mode
比system的好处可以获取运行的输出结果

调用popen去执行PSPS执行的结果会流到popen开辟的管道fp中 用fread去读
在这里插入图片描述

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: linux