走进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这些⽤⼾级⼯具来获取。
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{while(1){sleep(1);}return 0;
}

1.4 通过系统调用获取进程标示符
- 进程
id(PID) - 父进程
id(PPID)
#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有两个返回值- ⽗⼦进程代码共享,数据各⾃开辟空间,私有⼀份(采⽤写时拷⻉)

#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进⾏分流
#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){ //childprintf("I am child : %d!, ret: %d\n", getpid(), ret);}else{ //fatherprintf("I am father : %d!, ret: %d\n", getpid(), ret);}sleep(1);return 0;
}



