C C++最新Linux进程_linuxjingcheng(1),2024年最新C C++开发面试

img
img

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

需要这份系统化的资料的朋友,可以添加戳这里获取

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

7.I/O状态信息:包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表。
8.记账信息:包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。

通过系统调用创建进程-fork

在linux中使用fork函数创建子进程。
在这里插入图片描述
pid_t是ProcessID_Type的缩写,其实是宏定义的unsigned int类型。
在这里插入图片描述
fork返回值如果子进程创建成功给子进程返回0,父进程返回子进程pid,如果失败了给父进程返回-1。
从程序员的角度看fork之后父子进程共享用户代码,而用户数据各自私有一份。因为代码是只读的,不可以修改或写入,本质上是为了维护进程的独立性。
从操作系统角度看多了一个进程,多了一个内核数据结构task_struct,创建子进程,通常以父进程为模板。其中子进程默认使用父进程的代码和数据(写时拷贝)。

#include<stdio.h>
#include<unistd.h>

int main()
{
	printf("i am father: %d\n", getpid());
	pid_t ret = fork();
	if(ret == 0)
	{
		//child
		while(1)
		{
			printf("i am child, pid:%d, ppid:%d\n", getpid(), getppid());
			sleep(1);
		}
	}
	else if(ret > 0)
	{
		//father
		while(1)
		{
			printf("i am father, pid:%d, ppid:%d\n", getpid(), getppid());
			sleep(1);
		}
	}
	else
	{
		//出错
	}
	return 0;
}

在这里插入图片描述
可以通过getpid()函数查看进程pid,getppid()查看该进程父进程的pid。

进程状态

/\*
\* 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 \*/
};

R运行状态(running): 并不意味着进程一定在运行中,它表明进程要么是在运行中要么在运行队列里。
S睡眠状态(sleeping): 意味着进程在等待事件完成(这里的睡眠有时候也叫做可中断睡眠(interruptible sleep))。
D磁盘休眠状态(Disk sleep)有时候也叫不可中断睡眠状态(uninterruptible sleep),在这个状态的进程通常会等待IO的结束。

S状态和D状态对比:
S状态称为休眠状态,这种状态是浅度休眠,大部分的情况都属于浅度休眠。所谓浅度休眠指的是这种状态是可以被唤醒的。它虽然是一种休眠状态,但是随时可以接收外部的信号,处理外部的请求(通知它处理,它会在一瞬间醒来处理请求),换句话说,浅度休眠可以对外部事件做出反应。
D状态是深度休眠,深度休眠的进程不可被杀掉,即便是操作系统也不行。D状态通常在访问磁盘这样的IO设备,进行数据拷贝的关键步骤上需要将进程设置为D状态。D状态什么时候结束呢?只能等D状态的进程自动醒来,或者是关机重启(甚至重启都有可能导致机器被夯住)。
不管是深度休眠还是浅度休眠本质上都是一种等待状态。

T停止状态(stopped): 可以通过发送 SIGSTOP 信号给进程来停止(T)进程。这个被暂停的进程可以通过发送 SIGCONT 信号让进程继续运行。
t (tracing stop):进程在gdb调试的时候可能看到这个状态。

Z(zombie)-僵尸进程

进程退出的时候,会自动将自己退出时的相关信息写入进程的PCB中,供OS或者父进程读取。读取成功之后,该进程才算真正死亡(X状态)。当进程退出并且父进程没有读取到子进程退出的返回代码时就会产生僵尸进程(Z状态)。
僵死进程会以终止状态保持在进程表中,并且会一直在等待父进程读取退出状态代码。所以,只要子进程退出,父进程还在运行,但父进程没有读取子进程状态,子进程就进入Z状态。
D状态和Z状态发送9号信号kill不掉,因为一个是在深度休眠,一个已经挂掉了。
僵尸进程的危害
维护退出状态本身就是要用数据维护,也属于进程基本信息,所以保存在task_struct(PCB)中,换句话说,Z状态一直不退出,PCB就要一直维护。
一个父进程创建了很多子进程,就是不回收,就会造成内存资源的浪费,导致内存泄露。

孤儿进程

#include<stdio.h>
#include<stdlib.h> 
#include<unistd.h>

int main()
{
	if(fork() > 0)
	{
		sleep(5);                                                                                         
		printf("i am father,pid:%d i quit!\n", getpid());
		exit(0);
	}
	while(1)
	{                                                                                                     
		printf("i am child, pid:%d, ppid:%d\n", getpid(), getppid());
		sleep(1);


![img](https://img-blog.csdnimg.cn/img_convert/5012e0741e569e2515db93afd802d54a.png)
![img](https://img-blog.csdnimg.cn/img_convert/96f1f9dba6507a618749f312a87fb0c2.png)

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

**[需要这份系统化的资料的朋友,可以添加戳这里获取](https://bbs.csdn.net/topics/618668825)**


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

里获取](https://bbs.csdn.net/topics/618668825)**


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值