二阶段-linux-进程-笔记
2021/7/3 7:25:07
本文主要是介绍二阶段-linux-进程-笔记,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
学习内容:
1.进程相关概念
2.创建进程函数fork的使用
3.vfork函数创建进程,与fork函数区别
4.进程退出(父进程等待子进程退出)
5.exec族函数
6.system函数
7.popen函数
一、
1.什么是程序,什么是进程,有什么区别?
①程序是静态概念,gcc xxx.c -o pro
磁盘中生成的pro文件,叫做程序
②进程是程序一次运行活动,通俗意思是程序跑起来了,系统就多了一个进程
2.如何查看系统中有哪些进程?
①使用ps指令查看
实际工作中,配合grep来查找程序中是否存在某一进程
ps -aux 查看所有进程
ps -aux|grep init 其中grep 是过滤 后面是仅查看init进程
②使用top指令查看,类似windows任务管理器
3.什么是进程标识符?
①每个进程都有一个非负整数表示的唯一ID,叫做pid,类似身份证
Pid = 0:称为交换进程(swapper)
作用 --- 进程调度
Pid = 1 :init 进程
作用 --- 系统初始化
#include<stdlib.h> #include <sys/types.h> #include <unistd.h> //pid_t getpid(void); //pid_t getppid(void); int main(){ pid_t pid; pid = getpid(); printf("my pid is %d",pid); return 0; }
②编程调用getpid函数 获取自身的进程标识符,
getppid获取父进程的进程标识符
4.什么叫父进程,什么叫子进程
进程A创建了进程B
那么A叫做父进程,B叫做子进程,父子进程是相对的概念,理解为人类中的父子关系
5.C程序的存储空间是如何分配的?
二、创建进程函数fork的使用及应用场景
使用fork创建一个进程
pid_t fork(void);
fork函数调用成功,返回两次
返回值为0, 代表当前进程是子进程
返回值为非负数, 代表当前进程是父进程
调用失败, 返回-1
#include <unistd.h> #include<stdio.h> #include<sys/types.h> int main(){ pid_t pid; pid = fork(); if(pid>0){ printf("this is father print,father pid = %d\n",getpid()); } else if(pid == 0){ pirntf("thid is child print,child pid = %d\n",get[id()); } return 0; }
fork()后代码段共享,父子进程均跑
#include <unistd.h> #include<stdio.h> int main(){ pid_t pid; int date = 10; printf("father: id = %d\n",getpid()); pid = fork(); if(pid>0){ printf("this is father pid :%d\n",getpid()); }else if(pid == 0){ printf("this is child pid :%d\n",getpid()); date = date + 100; } printf("date = %d\n",date); return 0; }
输出结果:this is father pid = 6264
date = 10
this is child pid = 6265
date = 110
全拷贝与写实拷贝
全拷贝,数据端 堆 栈 文件io流等
copy on write子进程对数据不改变,就共享变量,只有子进程改变数据,才对子进程的地址空间拷贝一份数据修改
fork应用场景
fork创建一个子进程的一般目的
(1)一个父进程希望复制自己,使父、子进程同时执行不同的代码段。这在网络服务进程中最常见的----父进程等待客户的服务请求。当这种情况到达时,父进程调用fork,使子进程处理此请求。父进程则继续等待下一个服务请求 的到达。
(2)一个进程要执行一个不同的程序,这对shell是常见的情况。在这种情况下,子进程从fork返回后立即调用exec。
三、vfork函数也可以创建进程,与fork区别
关键区别一:
vfork直接使用父进程存储空间,不拷贝。
关键区别二:
vfork保证子进程先运行,当子进程调用exit退出后,父进程才执行。
四、进程退出
正常退出
1.Main函数调用return
2.进程调用exit(),标准c库
3.进程调用_exit()或者_Exit();属于系统调用
补充:
1.进程最后一个线程返回
2.最后一个县城调用pthread_exit
异常退出
1.调用abort
2.当进程收到某些信号时,如Ctrl+C
3.最后一个线程对取消(cancellation)请求做出响应
②父进程等待子进程退出
(a.一个父进程希望复制自己,使父子进程同时执行不同的代码段。这在网络服务进程中是常见的——父进程等待客户端的服务请求。当这种请求到达时,父进程调用fork,使子进程处理此请求。父进程则继续等待下一个服务请求的到达。
b.一个进程要执行一个不同的,这对shell是常见的情况。在这种情况下,子进程从fork返回后立刻调用exec)
父进程等待子进程退出并收集子进程的退出状态 wait(&status);父进程挂起状态等待子进程返回①wait();收集子进程状态,
waitpid(pid,&status,WNOHANG);子进程pid号,status(退出值),不挂起方式
父子进程一起走,不挂起,子进程结束状态被收集,变僵死进程
Waitpid
--子进程退出状态不被收集,变成僵死进程(僵尸进程(Z+))
---孤儿进程:
父进程如果不等待子进程退出,在子进程之前就结束了自己的”生命“,此时子进程叫做孤儿进程
linux避免系统存在过多的孤儿进程,init进程收留孤儿进程,变成孤儿进程的父进程。getppid()
五、exec族函数
原文 https://blog.csdn.net/u014530704/article/details/73848573
exec族函数函数的作用:
我们用fork函数创建新进程后,经常会在新进程中调用exec函数去执行另外一个程序。当进程调用exec函数时,该进程被完全替换为新程序。因为调用exec函数并不创建新进程,所以前后进程的ID并没有改变。
exec函数配合fork的使用:
实现功能,当父进程检测到输入为1的时候,建子进程把配置文件字段值修改掉。(简洁代码)
六、system函数
system相当于分装后的exec函数(简单粗暴,直接用) sh -c ./***
相关函数
fork,execve,waitpid,popen
表头文件
#include<stdlib.h>
定义函数
int system(const char * string);
函数说明
system()会调用fork()产生子进程,由子进程来调用/bin/sh-c string来执行参数string字符串所代表的命令,此命令执行完后随即返回原调用的进程。在调用system()期间SIGCHLD 信号会被暂时搁置,SIGINT和SIGQUIT 信号则会被忽略。
返回值
如果system()在调用/bin/sh时失败则返回127,其他失败原因返回-1。若参数string为空指针(NULL),则返回非零值。如果 system()调用成功则最后会返回执行shell命令后的返回值,但是此返回值也有可能为system()调用/bin/sh失败所返回的127,因此最好能再检查errno 来确认执行成功。
附加说明
在编写具有SUID/SGID权限的程序时请勿使用system(),system()会继承环境变量,通过环境变量可能会造成系统安全的问题。
七、popen函数
popen比system好处是 可以获取运行的结果
https://blog.csdn.net/libinbin_1014/article/details/51490568
学习产出:
提示:这里统计学习计划的总量
例如:
1、 技术笔记 2 遍
2、CSDN 技术博客 3 篇
3、 学习的 vlog 视频 1 个
这篇关于二阶段-linux-进程-笔记的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23linux 系统宝塔查看网站访问的命令是什么?-icode9专业技术文章分享
- 2024-11-12如何创建可引导的 ESXi USB 安装介质 (macOS, Linux, Windows)
- 2024-11-08linux的 vi编辑器中搜索关键字有哪些常用的命令和技巧?-icode9专业技术文章分享
- 2024-11-08在 Linux 的 vi 或 vim 编辑器中什么命令可以直接跳到文件的结尾?-icode9专业技术文章分享
- 2024-10-22原生鸿蒙操作系统HarmonyOS NEXT(HarmonyOS 5)正式发布
- 2024-10-18操作系统入门教程:新手必看的基本操作指南
- 2024-10-18初学者必看:操作系统入门全攻略
- 2024-10-17操作系统入门教程:轻松掌握操作系统基础知识
- 2024-09-11Linux部署Scrapy学习:入门级指南
- 2024-09-11Linux部署Scrapy:入门级指南