Linux最新【Linux】初识系统调用&&进程状态_sigstop(1),2024年最新推荐给大家

最全的Linux教程,Linux从入门到精通

======================

  1. linux从入门到精通(第2版)

  2. Linux系统移植

  3. Linux驱动开发入门与实战

  4. LINUX 系统移植 第2版

  5. Linux开源网络全栈详解 从DPDK到OpenFlow

华为18级工程师呕心沥血撰写3000页Linux学习笔记教程

第一份《Linux从入门到精通》466页

====================

内容简介

====

本书是获得了很多读者好评的Linux经典畅销书**《Linux从入门到精通》的第2版**。本书第1版出版后曾经多次印刷,并被51CTO读书频道评为“最受读者喜爱的原创IT技术图书奖”。本书第﹖版以最新的Ubuntu 12.04为版本,循序渐进地向读者介绍了Linux 的基础应用、系统管理、网络应用、娱乐和办公、程序开发、服务器配置、系统安全等。本书附带1张光盘,内容为本书配套多媒体教学视频。另外,本书还为读者提供了大量的Linux学习资料和Ubuntu安装镜像文件,供读者免费下载。

华为18级工程师呕心沥血撰写3000页Linux学习笔记教程

本书适合广大Linux初中级用户、开源软件爱好者和大专院校的学生阅读,同时也非常适合准备从事Linux平台开发的各类人员。

需要《Linux入门到精通》、《linux系统移植》、《Linux驱动开发入门实战》、《Linux开源网络全栈》电子书籍及教程的工程师朋友们劳烦您转发+评论

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以点击这里获取!

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

//所需的头文件
#include <sys/types.h>
#include <unistd.h>
//函数接口
pid_t getpid(void);//查看进程ID
pid_t getppid(void);//查看父进程ID


![image-20221119204400248](https://img-blog.csdnimg.cn/img_convert/71709b79aae14b59bded731aa9e0a4d9.png)


运行结果:


![image-20221119205305859](https://img-blog.csdnimg.cn/img_convert/ee55f7cb6d6d0aafcc84a5329ac26efe.png)




---


### 通过其他方式查看PID


首先我们想知道进程的PID,可以通过`top`或者`ps`命令来查看。


#### Top


在命令行执行`top`后,得到类似下面的输出


![image-20221119205436415](https://iubaopicbed.oss-cn-shenzhen.aliyuncs.com/img2/picbed202211192054509.png)
#### PS


执行`ps axj`后输出如下,其中`axj`参数让`ps`命令显示更详细的参数信息。


![image-20221119205532818](https://iubaopicbed.oss-cn-shenzhen.aliyuncs.com/img2/picbed202211192055901.png)
#### 使用PID


拿到PID后,我们就可以通过`kill`命令来结束进程了,也可以通过`kill -9`或其他数字向进程发送不同的信号。


信号是个很重要的概念,我们后面会详细介绍,那么有了进程ID,我们也可以看看进程名字。




---


### 1.2 通过系统调用创建进程-fork初识


* 运行 man fork 认识fork
* 感性的知道fork有两个返回值
* 父子进程代码共享,数据各自开辟空间,私有一份(采用写时拷贝)(后面章节细讲)



//头文件
#include <unistd.h>
pid_t fork(void);


![image-20221119210139804](https://img-blog.csdnimg.cn/img_convert/36a50715d60328855eb708ffae5e4a3f.png)


从它的介绍中可以知道fork对父进程返回大于0的数字(本质上是子进程的pid),对子进程返回0,失败返回-1



#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
int ret = fork();
if(ret < 0)
{
perror(“fork”);
return 1;
}
else if(ret == 0)
{ //child
printf(“I am child : %d!, ret: %d\n”, getpid(), ret);
}else
{ //father
printf(“I am father : %d!, ret: %d\n”, getpid(), ret);
}
sleep(1);
return 0;
}


![image-20221119211321507](https://iubaopicbed.oss-cn-shenzhen.aliyuncs.com/img2/picbed202211192113555.png)
![image-20221119211338326](https://img-blog.csdnimg.cn/img_convert/c3953dd205436563ee3a4198a57695de.png)




---


## 2. 进程状态


### 看看Linux内核源代码怎么定义


根据进程的定义,我们知道进程是代码运行的实体,而进程有可能是正在运行的,也可能是已经停止的,这就是进程的状态。


网上有人总结进程一共5种状态,也有总结是8种,究竟应该怎么算呢,最好的方法还是看Linux源码。


下面的状态在kernel源代码里定义:



/*
* The task state array is a strange “bitmap” of
* reasons to sleep. Thus “running” is zero, and
* you can test for combinations of others with
* simple bit tests.
*/
static const char * const task_state_array[] = {
“R (running)”, /* 0 */
“S (sleeping)”, /* 1 */
“D (disk sleep)”, /* 2 */
“T (stopped)”, /* 4 */
“t (tracing stop)”, /* 8 */
“X (dead)”, /* 16 */
“Z (zombie)”, /* 32 */
};


这真的是Linux的源码,可以看出进程一共7种状态,含义也比较清晰,注意其中D(disk sleep)称为不可中断睡眠状态(uninterruptible sleep)。



> 
> * **R运行状态**(running) : 并不意味着进程一定在运行中,它表明进程要么是在运行中要么在运行队列  
>  里。
> * **S睡眠状态**(sleeping): 意味着进程在等待事件完成(这里的睡眠有时候也叫做可中断睡眠  
>  (interruptible sleep))。
> * **D磁盘休眠状态**(Disk sleep)有时候也叫不可中断睡眠状态(uninterruptible sleep),在这个状态的  
>  进程通常会等待IO的结束。
> * **T停止状态(stopped)**: 可以通过发送 SIGSTOP 信号给进程来停止(T)进程。这个被暂停的进程可  
>  以通过发送 SIGCONT 信号让进程继续运行。
> * **X死亡状态(dead)**:这个状态只是一个返回状态,你不会在任务列表里看到这个状态
> 
> 
> 




---


### 查看状态


通过`ps aux`可以看到进程的状态。


O:进程正在处理器运行,这个状态从来没有见过.  
 S:休眠状态(sleeping)  
 R:等待运行(runable)R Running or runnable (on run queue) 进程处于运行或就绪状态  
 I:空闲状态(idle)  
 Z:僵尸状态(zombie)  
 T:T停止状态(stopped)  
 D: 不可中断的深度睡眠,一般由IO引起,同步IO在做读或写操作时,cpu不能做其它事情,只能等待,这时进程处于这种状态,如果程序采用异步IO,这种状态应该就很少见到了


其中就绪状态表示进程已经分配到除CPU以外的资源,等CPU调度它时就可以马上执行了。运行状态就是正在运行了,获得包括CPU在内的所有资源。等待状态表示因等待某个事件而没有被执行,这时候不耗CPU时间,而这个时间有可能是等待IO、申请不到足够的缓冲区或者在等待信号。




---


### Z(zombie)-僵尸进程



> 
> 僵死状态(Zombies)是一个比较特殊的状态。当进程退出并且父进程(使用wait()系统调用,后面讲)  
>  没有读取到子进程退出的返回代码时就会产生僵死(尸)进程  
>  僵死进程会以终止状态保持在进程表中,并且会一直在等待父进程读取退出状态代码。  
>  所以,只要子进程退出,父进程还在运行,但父进程没有读取子进程状态,子进程进入Z状态
> 
> 
> 


一个创建维持30秒的僵死进程例子 :



#include <stdio.h>
#include <stdlib.h>
int main()
{
pid_t id = fork();
if (id < 0){
perror(“fork”);
return 1;
}
else if (id > 0){ //parent
printf(“parent[%d] is sleeping…\n”, getpid());
sleep(30);
}
else{
printf(“child[%d] is begin Z…\n”, getpid());
sleep(5);
exit(EXIT_SUCCESS);
}
return 0;
}


编译并在另一个终端下启动监控


![image-20221119213127851](https://img-blog.csdnimg.cn/img_convert/a26af9f3782dd87d0b6c47ae0c8037d4.png)
开始测试


![image-20221119213148845](https://img-blog.csdnimg.cn/img_convert/a39656c41d72a683bcd5186697603b4d.png)
看到结果


![image-20221119213231748](https://img-blog.csdnimg.cn/img_convert/89edd60773fa69f74e57f771add62f23.png)




---


### 僵尸进程危害





**先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前在阿里**

**深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**

**因此收集整理了一份《2024年最新Linux运维全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。**
![img](https://img-blog.csdnimg.cn/img_convert/205b61121d3134a12a63912541cd696e.png)
![img](https://img-blog.csdnimg.cn/img_convert/a01ce39ac90a518fc29e6e457ea4e6db.png)
![img](https://img-blog.csdnimg.cn/img_convert/b6b9139ead2d6622739811711c0c3643.png)
![img](https://img-blog.csdnimg.cn/img_convert/7f3b21dae0358530a856b98bf7e6e47a.png)
![img](https://img-blog.csdnimg.cn/img_convert/0691a9039904ee2f4095d959cedde35d.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上运维知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[需要这份系统化的资料的朋友,可以点击这里获取!](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)**

43618302)]
[外链图片转存中...(img-8DV1Ua4J-1715343618303)]
[外链图片转存中...(img-PDrPgyu0-1715343618303)]

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上运维知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[需要这份系统化的资料的朋友,可以点击这里获取!](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)**

  • 18
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值