走进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就和我们的学号一样,每个人都不一样,是标识每个人不一样的标识符 。

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

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;
}
相关推荐
TangGeeA1 小时前
命令安全设置
java·服务器·安全
水饺编程1 小时前
第2章:Linux 基础,rm 命令
linux·c语言·汇编
范同学~1 小时前
固定表头+第一列+最后一列
java·服务器·前端
雪落漂泊1 小时前
Linux基础开发工具(三)gcc/g++与make/makefile篇
linux·运维·服务器
Sayai1 小时前
Neo4j 社区版高可用实战:DRBD 块级复制 + Keepalived 虚拟 IP 冷备切换(附启停 SOP 与脑裂防范)
运维·neo4j·keepalived·高可用·drbd
爱吃辣椒的小豆豆1 小时前
Linux-sshd-实战-白名单与跳板机
linux·运维·服务器
气质、小青年!1 小时前
进程1学习
linux·学习
强哥聊算力2 小时前
《算力江湖·国产GPU突围:摩尔线程故事》第四集:从图形到AI:摩尔线程为什么必须冲进大模型赛道?
运维·服务器·人工智能·ai·gpu算力
blueSatchel2 小时前
framebuffer注册源码解读
linux·嵌入式
2401_862880822 小时前
嵌入式Linux系统移植与驱动开发完整指南
linux·c语言·驱动开发