走进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;
}
相关推荐
Uncertainty!!42 分钟前
Ubuntu 22.04 安装超好用中文输入法rime-ice(雾凇拼音)过程记录
linux·ubuntu·中文输入法
ShineWinsu2 小时前
对于Linux:网络基础的解析
linux·网络·面试·udp·笔试·ip·tcp
Asuicao2 小时前
centos7.9版本升级ssh OpenSSH 9.8p1 源码 OpenSSL 1.1.1w 源码包以及安装升级回滚文档
运维·ssh
耍酷的魔镜2 小时前
谈谈如何使用Netty开发实现高性能的RPC服务器
服务器·网络协议·rpc
志栋智能2 小时前
超自动化安全中的威胁狩猎
运维·安全·自动化
↘"LYong3 小时前
旧版 CentOS 安装 Docker 完整指南(附国内镜像加速)
linux·运维·docker
Zhang~Ling3 小时前
Vim 多模式详解:命令、插入、底行与插件配置
linux·编辑器·vim
Elastic 中国社区官方博客4 小时前
Elastic 在 Everest Group 企业搜索产品 PEAK Matrix® 评估 2026 中被评为领导者
大数据·运维·人工智能·elasticsearch·搜索引擎·ai·全文检索
程序员在囧途4 小时前
likeadmin-api API 中转站怎么做统一报价?从 /pricing、/user/balance 到 task_id 回执的落地方法
运维·服务器·数据库·likeadmin-api·api中转站·token计费
cookies_s_s4 小时前
C++ 字符串动态创建对象 -- 工厂模式、自动注册、模板递归动态调用
服务器·开发语言·c++