linux学习笔记(代码片段)

你算哪一个bug? 你算哪一个bug?     2022-11-30     235

关键词:

🍋fork()

🍍fork()

fork是什么?

C语言里的一个创建子进程的函数

🍓作用:创建子进程

创建后有两个进程,一个父亲,一个儿子

🍓父子共享用户代码 而用户数据各自私有一份

共享代码私有数据的目的:维护进程的独立性

🍓创建子进程:子进程的创建是以父进程为模板的,即默认使用的是父进程的代码和数据(如果子进程需要更改数据,就会在一块单独的空间拷贝一份数据,也就是更改时会创建副本,即写时拷贝)

操作系统中 所有进程具有独立性,不相互影响

你同时用网易云听歌和挂着qq,关闭qq时也不会影响网易云的播放对吧

🍓理解fork

先让我们问问Linux里的man

函数的返回值类型是pid_t(int),作用是创建子进程

🍓fork()函数的返回值:父进程返回值是子进程的pid,子进程如果创建成功返回0,失败则返回-1

fork函数有两个返回值,父进程一个,子进程一个,父进程调用fork创建子进程,因为代码是共享的,所以两个进程都会return。

test.c//测试代码  注意后面的测试用例都是用这个代码
#include<stdio.h>    
#include<unistd.h>          
int main()    
    
printf("i am a process ,pid:: %d\\n",getpid());    
int ret=fork();  //ret接收返回值  
if(ret>0)    
    
 while(1)    
     
   printf("i am father,pid:: %d\\n",getpid());    
   sleep(1);    
     
    
else    
    
 while(1)    
     
 printf("i am son,pid::%d,my father is %d\\n",getpid(),getppid());   
   sleep(1);                                                       
     
    

return 0;    
   

🍓运行:

🍓运行时输入 ps axj|head -1&&ps axj|grep test

运行完之后进程被销毁,要看到这个C程序相应的进程就得在运行时输入命令

🍓显然,创建子进程成功,父子进程交替运行

效果看起来像父子同时运行,是因为CPU切换进程的时间很短,所以几乎就是同时的,这也就是并发(单核CPU)

多核CPU同时进行多个任务,也就是并行

🍓通常用法:和if配合使用,使得一个进程运行不同的程序

🍓从内核的角度,系统是不是多了一个进程?

是的,通过上面的ps命令可以看到显然有两个进程在运行

🍓为什么给子进程创建返回的是0,父进程返回的是子进程的PID

理解一个父亲可以有多个儿子,而每个儿子只有一个父亲,即一个父进程可以有多个子进程,父进程返回的PID更好找儿子

🍓进程=我的程序代码+内核的数据结构(task_struct)

task_struct 是PCB(进程控制块),前面的文章有讲过,里面放着进程的各种信息

这个结构体在源码里也可以找到

🍋进程状态

🍅操作系统下描述的状态

🍅具体的操作系统Linux下的进程状态

R :运行状态

S :睡眠状态(浅睡眠)

D :磁盘休眠状态(深睡眠)

T :停止状态

t :跟踪状态

Z :僵尸状态

X:死亡状态

🥝运行状态就一定在运行吗?

不一定,在运行队列里也叫运行状态,也就是可执行但还没被调度

换种说法,R状态的意思是我准备好了 可以被CPU调度

🥝S和D的区别

S(可中断的睡眠状态)还可以对外部状态做出反应,就比如你睡觉时还是能被叫醒的

D(不可中断的睡眠状态)保护一些进程不被打断,比如公司上传数据时进程突然被打断了,那损失就大了,D状态就可以预防这种事故发生

注:D状态不能被kill掉

🥝T状态

可以通过kill命令清除进程或者让进程停止

进程停止:kill -19 PID 停止进程

继续进程:kill -18 PID 让停止的进程继续

清除进程 kill -9 PID 清除进程

🥝Z状态

🥝进程退出: 一般不会立即让操作系统(OS)回收资源

在进程退出的时候,会自动将自己退出的相关信息写入进程的PCB中,这也就是Z(僵尸)状态

在OS或父进程读取完后该进程才算真正死亡,进入X(死亡)状态

创建进程是为了完成任务,比如写入到PCB的信息就会包括任务是否完成等

🥝什么样的进程杀不掉

僵尸状态(Z)和磁盘休眠(D)不能被杀掉

🥝上图可以看出父进程状态是S(睡眠)状态,按理来说是R状态啊,ps获取的是这个时刻进程的状态,按CPU的运行速度,运行的时间很短,运行一次得睡上一秒,所以获取到的是sleep状态,看到的就会是S状态

被杀掉的进程显示Z状态,出现一个英文单词defunct

🥝看进程状态时,发现有些显示S有些显示S+

带‘+’表示是前台运行,不带是后台运行

前台运行的进程可以输入命令,可以被bash(命令行解释器)识别

后台运行的则不行,后台停止可采用fg命令将后台转到前台再ctrl+c停止程序

./可执行程序 & 表示在后台运行

如./test &

🥝孤儿进程 领养人:1

什么是孤儿进程

父进程先被杀掉了,只剩下子进程了

(子进程:坏了,我成孤儿了[doge]

🥝孤儿的领养人:1号进程(PID为1的进程)

1号进程负责回收孤儿进程,上文说过进程死后写入进PCB的信息被父进程或者OS读取才算真正死亡,子进程在父亲死亡后,由1号system进程承担这个责任

🥝1号进程 又称为system/init 进程

这个进程是杀不死的,即kill发送给1号进程的信号会被忽略

领养人选为1号进程,好回收孤儿进程释放的资源(收尸…)

🥝操作系统的状态和Linux的状态对应图

末尾 📖

如果有帮助的话麻烦点个赞鼓励一下!

linux学习笔记(代码片段)

Linux学习笔记(二)Author:akynazhBlog:akynazh.site一些文件操作pwdpwd[-P]-P:显示出确实的路径,而非使用链接(link)路径。mkdirmkdir[-mp]目录名称-m:设置文件的权限喔!直接设置,不需要看默认权限(umask... 查看详情

linux学习笔记(代码片段)

Linux学习笔记(一)Author:akynazhBlog:akynazh.siteLinux开机CMOS是记录各项硬件参数且嵌入在主板上面的储存器BIOS则是一个写入到主板上的一个固件(固件就是写入到硬件上的一个软件程序)。这个BIOS就是在开机的时候,计算... 查看详情

linux学习笔记持续更新(代码片段)

Linux笔记安装部分:分区注意:swap虚拟内存为内存的两倍例如4G(如果大的话就不用设置)boot分区主引导500M/根全部分配还可以创一个/data,可以用来挂载东西用配置部分:hostnamectlset-hostnamename#设置主机名... 查看详情

linux学习-linux系统及编程基础笔记(代码片段)

useraddzhangsanpasswdzhangsanvisudo往/etc/sudoers文件中添加zhangsan#visudo找到如下的行rootALL=(ALL)ALL往该行下面添加zhangsanzhangsanALL=(ALL)ALL2.2Linux的基本结构一些根文件系统中较为重要的二级目录:①/boot:存放系统引导时所需的文件&#... 查看详情

嵌入式linux学习笔记fbtft使用笔记(代码片段)

前言在断断续续学习了比较长时间的嵌入式Linux之后,我着手准备自己设计一款Linux的小电脑,在设计硬件之前,我需要掌握一些软硬件的使用,比如fbtft用于驱动小LCD屏幕,usb摄像头,2.4Gwifi模块等我对Linu... 查看详情

嵌入式linux学习笔记fbtft使用笔记(代码片段)

前言在断断续续学习了比较长时间的嵌入式Linux之后,我着手准备自己设计一款Linux的小电脑,在设计硬件之前,我需要掌握一些软硬件的使用,比如fbtft用于驱动小LCD屏幕,usb摄像头,2.4Gwifi模块等我对Linu... 查看详情

linux学习笔记(代码片段)

目录1、Linux基本篇1、Linux目录结构2、vi和vim2.1基本介绍2.2常见的三种模式及转换2.3练习案例3、开机、重启、登录、注销4、用户管理4.1添加用户4.2删除用户4.3查询用户信息4.4切换用户4.5用户组5、实用指令5.1指定运行级别5.2例子&#x... 查看详情

linux学习笔记(代码片段)

文章目录前言一.Shell基础1.查看2.安装3.使用4.Bash基本特性Bash解释器具有许多方便的快捷键查看历史命令命令别名标准输入输出的重定向管道二.helloworld三.变量1.自定义变量定义变量取消变量变量规范2.环境变量3.位置变量4.预定义... 查看详情

linux深度学习进展笔记(代码片段)

1.环境搭建无线网卡驱动AX201安装:下载合适的无线网卡驱动具体下载链接:https://www.intel.com/content/www/us/en/support/articles/000005511/wireless.html把下载好的ucode文件复制到/lib/firmware里cp*.ucode/lib/firmware-然后重启增加用户组sudoadd 查看详情

linux深度学习进展笔记(代码片段)

1.环境搭建无线网卡驱动AX201安装:下载合适的无线网卡驱动具体下载链接:https://www.intel.com/content/www/us/en/support/articles/000005511/wireless.html把下载好的ucode文件复制到/lib/firmware里cp*.ucode/lib/firmware-然后重启增加用户组sudoadd 查看详情

linux学习笔记——常用命令(代码片段)

...量的Python库文件,能点灯,能做视觉处理、机器学习和科学计算。也逐渐认识到系统的强大,也慢慢不局限于做一些小作品。目标是嵌入式Linux 查看详情

linux学习笔记2022-11-12---------linux基础(代码片段)

目录1.用户类型2.终端terminal2.1终端类型2.2查看当前的终端设备3.交互式接口3.1交互式接口类型3.2什么是shell3.3Shell是如何连接用户和内核的?3.4Shell还能连接其它程序3.5Shell也支持编程3.6Shell是一种脚本语言4.修改主机名5.命令提... 查看详情

嵌入式linux学习笔记(代码片段)

常用操作&相关知识压缩解压解压.tar.bz2tar-vxjflinux-imx-4.1.15-2.1.0-g8a006db.tar.bz2压缩.tar.bz2tar-vcjfalientek_uboot.tar.bz2alientek_uboot编译将前面编译出来的led.o文件链接到0X87800000这个地址,使用如下命令:arm-linux-gnueab 查看详情

linux进程——学习笔记(代码片段)

文章目录认识操作系统冯诺依曼体系结构是计算机的基本结构操作系统进程的概念task_struct的内容进程抢占:并行和并发查看进程创建进程理解fork:进程的状态孤儿进程进程的优先级认识操作系统冯诺依曼体系结构是计... 查看详情

linux进程——学习笔记(代码片段)

文章目录认识操作系统冯诺依曼体系结构是计算机的基本结构操作系统进程的概念task_struct的内容进程抢占:并行和并发查看进程创建进程理解fork:进程的状态孤儿进程进程的优先级认识操作系统冯诺依曼体系结构是计... 查看详情

mooc《linux操作系统编程》学习笔记-实验六(代码片段)

实验六线程同步实验https://www.icourse163.org/learn/UESTC-1003040002?tid=1455108444#/learn/content?type=detail&id=1228729539&cid=1245454470实验六 线程同步实验https://www.icourse163.org/learn/UESTC-1003040002?tid=14 查看详情

linux学习笔记(代码片段)

文章目录🍋fork()🍓理解fork🍋进程状态🍅操作系统下描述的状态🍅具体的操作系统Linux下的进程状态🥝运行状态就一定在运行吗?🥝S和D的区别🥝T状态🥝Z状态🥝什么样的进程杀不掉... 查看详情

iptables学习笔记(代码片段)

学习的视频:http://edu.51cto.com/course/12914.htmlIPTABLESLINUX防火墙引言:iptables作为一款老牌的Linux防火墙,给Linux系统提供了基于内核的安全防护机制。优点:系统自带,无需安装,工作在OS底层(内核)从理论上说安全性更高;缺点... 查看详情