社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
一、基本概念
·课本概念:程序的一个执行实例,正在执行的程序等。
·内核观点:担当分配系统资源(CPU时间、内存)的实体。
二、描述进程
·进程信息被放在一个叫进程控制块的数据结构中,可以理解为进程属性的集合。
·课本上称为PCB,Linux操作系统下的PCB是:task_struct。
1、task_struct-PCB的一种
·在Linux中描述进程的结构体叫task_struct。
·task_struct是Linux内核的一种数据结构,它会被装在到RAM(内存)里并包含着进程的信息。
2、task_struct分类
·标识符:描述本进程的唯一标识符,用于区别其他进程
·状态:任务状态、退出代码、退出信号等
·优先级:相对于其它进程的优先级
·程序计数器:程序中即将被执行的下一条指令的地址
·内存指针:包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针
·上下文数据:进程执行时处理器的寄存器中的数据
·I/O状态信息:包括显示I/O请求,分配给进程的I/O设备和被进程使用的文件列表
·记账信息:可能包括处理器时间总和、使用的时钟数总和、时间限制、记账号等
三、组织进程
可以在内核源代码里找到组织进程。所有运行在系统里的进程都以task_struct链表的形式存在在内核里
四、查看进程
进程的信息可以通过/proc系统文件来查看
例:获取PID为1的进程的信息
五、通过系统调用获取进程标识符
·进程id(PID)
·父进程id(PPID)
1 #include<stdio.h>
2 #include<sys/types.h>
3 #include<unistd.h>
4
5 int main()
6 {
7 printf("pid %dn",getpid());
8 printf("ppid %dn",getppid());
9 return 0;
10 }
六、通过系统调用创建进程(fork初识)
·运行man fork认识fork
·fork有两个返回值
·父子进程共享代码,数据各自开辟空间,私有一份(采用写时拷贝)
1 #include<stdio.h>
2 #include<sys/types.h>
3 #include<unistd.h>
4
5 int main()
6 {
7 int ret = fork();
8 printf("hello proc : %d!,ret : %dn",getpid(),ret);
9 sleep(2);
10 return 0;
11 }
·fork之后通常要用if分流
1 #include<stdio.h>
2 #include<sys/types.h>
3 #include<unistd.h>
4
5 int main()
6 {
7 int ret = fork();
8 if(ret < 0){
9 perror("fork");
10 return 1;
11 }
12 else if(ret == 0){//child
13 printf("I am child: %d!,ret : %dn",getpid(),ret);
14 }
15 else{//parent
16 printf("I am parent : %d!,ret : %dn",getpid(),ret);
17 }
18 sleep(2);
19 return 0;
20 }
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!