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创建了进程b,a就是父进程,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所返回的终止状态的宏:
WIFEXITED(status):
若为正常终止子进程返回的状态,则为真,对于这种情况,
可执行WIFEXITED(status),取子进程传给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 popen(const char command , const char* mode)
比system的好处:可以获取运行的输出结果

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值