走进Linux的世界:初识进程(Task)

嘿,各位技术潮人!好久不见甚是想念。生活就像一场奇妙冒险,而编程就是那把超酷的万能钥匙。此刻,阳光洒在键盘上,灵感在指尖跳跃,让我们抛开一切束缚,给平淡日子加点料,注入满满的

passion。准备好和我一起冲进代码的奇幻宇宙了吗?Let's go!

我的博客:yuanManGan

我的专栏:C++入门小馆 C言雅韵集 数据结构漫游记 闲言碎语小记坊 进阶数据结构 走进Linux的世界 题山采玉 领略算法真谛


1. 进程


我们先来了解一下什么是进程什么不是进程

课本:

  • 进程:运行起来的程序,内存中的程序。

这样描述是不正确的,我们的程序本质上就是文件OS不会直接与磁盘中的文件进行交互,它只会和内存打交道,要执行一个程序,就得将它的代码和数据加载到内存中,OS再用PCB结构体将每个进程连接起来这样就形成了进程。


1.1. 描述进程的结构体PCB


课本上称之为PCB(process control block)Linux 操作系统下的 PCB 是: task_struct

  • 在 Linux 中描述进程的结构体叫做 task_struct 。
  • task_struct 是 Linux 内核的⼀种数据结构类型,它会被装载到RAM(内存)⾥并且包含着进程的信息。

1.2 task_ struct


  • 标识符: 描述本进程的唯⼀标⽰符,⽤来区别其他进程。
  • 状态: 任务状态,退出代码,退出信号等。
  • 优先级: 相对于其他进程的优先级。
  • 程序计数器: 程序中即将被执⾏的下⼀条指令的地址。
  • 内存指针: 包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针
  • 上下⽂数据: 进程执⾏时处理器的寄存器中的数据[休学例⼦,要加图CPU,寄存器]。
  • I/O状态信息: 包括显⽰的I/O请求,分配给进程的I∕O设备和被进程使⽤的⽂件列表。
  • 记账信息: 可能包括处理器时间总和,使⽤的时钟数总和,时间限制,记账号等。
  • 其他信息

我们后面会花大量的时间一个一个介绍这些内容的。


1.3 查看进程


在我们的/proc文件夹里面包含了所有的进程,而我们所有的进程的标识符PID就和我们的学号一样,每个人都不一样,是标识每个人不一样的标识符 。

⼤多数进程信息同样可以使⽤topps这些⽤⼾级⼯具来获取。

cpp 复制代码
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
	while(1)
	{
		sleep(1);
	}
	return 0;
}

1.4 通过系统调用获取进程标示符


  • 进程 id(PID)
  • 父进程 id(PPID)
cpp 复制代码
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
	printf("pid: %d\n", getpid());
	printf("ppid: %d\n", getppid());
	return 0;
}

1.5 初识FORK


  • 运⾏ man fork 认识fork
  • fork有两个返回值
  • ⽗⼦进程代码共享,数据各⾃开辟空间,私有⼀份(采⽤写时拷⻉)
cpp 复制代码
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
	int ret = fork();
	printf("hello proc : %d!, ret: %d\n", getpid(), ret);
	sleep(1);
	return 0;
}
  • fork 之后通常要⽤if进⾏分流
cpp 复制代码
#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;
}
相关推荐
是专家不是砖家2 小时前
linux USB摄像头不停掉线问题
linux·运维·服务器
NiKo_W2 小时前
Linux UdpSocket的应用
linux·服务器·网络·内核·线程
稚辉君.MCA_P8_Java2 小时前
深入理解 TCP;场景复现,掌握鲜为人知的细节
java·linux·网络·tcp/ip·kubernetes
小无名呀2 小时前
socket_udp
linux·网络·c++·网络协议·计算机网络·udp
小马哥编程2 小时前
【软考架构】案例分析-瘦客户端C/S架构
运维·服务器·架构
大大da怪i2 小时前
WSL-Ubuntu忘记root密码,修改root密码
linux·ubuntu
老黄编程2 小时前
09-ubuntu20.04 执行 apt update时报错,是因为官网已停止维护不再更新的缘故吗?
linux·运维·服务器·ubuntu·数字证书
Supernova_Jun2 小时前
ffmpeg图片转视频
linux·运维·服务器
水月wwww3 小时前
ubuntu网络连接出错解决办法
linux·运维·计算机网络·ubuntu·操作系统·ubuntu网络连接