走进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;
}
相关推荐
傻啦嘿哟19 小时前
自动化养号:利用代理池模拟人工操作,进行社交媒体账号维护
运维·自动化·媒体
by————组态20 小时前
Ricon组态技术架构 - 企业级Web组态解决方案
运维·服务器·前端·物联网·架构·组态·组态软件
m0_5261194020 小时前
ssh key生成,gitee配置ssh
运维·gitee·ssh
赋缘汇(fableshare)-黄从庆20 小时前
Ubuntu重启后进入initramfs导致无法开机
linux·运维·ubuntu
CHINA红旗下20 小时前
固定虚拟机的IP地址
运维·服务器·网络
DO_Community20 小时前
百亿参数开源模型托管成本账:从按 Token 计费到单卡 GPU 服务器怎么选?
运维·服务器·开源·llm·agent
1024+20 小时前
在 ‌Ubuntu 24.04‌ 上安装 ‌Python 3.8‌
linux·python·ubuntu
着迷不白20 小时前
十、网络客户端工具curl, wget, ssh, scp, sftp, rsync
运维·网络·ssh
the sun3420 小时前
集群架构实操:MySQL主、从节点配置
运维·服务器
袁小皮皮不皮20 小时前
6.HCIP OSPF域间防环机制与虚链路
服务器·网络·笔记·网络协议·学习·智能路由器