进程初识

基本概念

课本概念:程序的一个执行实例,正在执行的程序等
内核观点:担当分配系统资源(CPU时间,内存)的实体。  

描述进程-PCB

进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合。
课本上称之为PCB(process control block),Linux操作系统下的PCB是: task_struct 

进程 = 进程的代码和数据+进程对应的PCB结构体  

task_struct-PCB的一种 

在Linux中描述进程的结构体叫做task_struct。
task_struct是Linux内核的一种数据结构,它会被装载到RAM(内存)里并且包含着进程的信息。 

task_ struct内容分类 

标示符: 描述本进程的唯一标示符,用来区别其他进程。
状态: 任务状态,退出代码,退出信号等。
优先级: 相对于其他进程的优先级。
程序计数器: 程序中即将被执行的下一条指令的地址。
内存指针: 包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针
上下文数据: 进程执行时处理器的寄存器中的数据[休学例子,要加图CPU,寄存器]。
I/O状态信息: 包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表。
记账信息: 可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。
其他信息

组织进程 

可以在内核源代码里找到它。所有运行在系统里的进程都以task_struct链表的形式存在内核里。 

查看进程

先创建一个proc.c文件,用于测试。

#include <stdio.h>      
#include <unistd.h>    
                                                                                                                                                                                                                                                 
int main()                                
{                                         
    while (1)                             
    {                                     
        printf("hello proc\n");           
        sleep(1);                                                                                               
    }                                                                                                           
    return 0;                                                                                                   
} 

然后编译运行,同时打开另一个会话来查看进程

这里用到指令ps 

输入指令ps axj | head -1 && ps axj | grep proc
就可以筛选出我们的proc进程的信息了 

可以看到我们进程proc的PID是14540


查看我们的根目录下的proc文件中的信息,会发现有一个文件的文件名和我们的proc进程的PID是一样的,同样是14540


接下来去查看这个文件中的内容

这个文件的内容就是进程对应的信息,每个进程都会有一个属性来保存自己所在工作路径,如上图中的cwd(current work director y)


若要终止proc进程可以使用指令kill -9 进程对应的PID


通过系统调用获取进程标示符

通过指令man getpid查看调用相关文档 

函数的返回类型pid_t是无符号整型

如果无法查看,则需先执行指令sudo yum insatll man-pages -y来下载对应的文档


接下来修改一下proc.c文件,进行下一步测试

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>

int main()
{
    while (1)
    {
        printf("hello proc, pid:%d, ppid:%d\n", getpid(), getppid());
        sleep(1);
    }
    return 0;
}

 编译运行

可以发现,虽然每次proc进程的pid都是不同的,但是它的父进程的pid却始终不变,这个父进程其实就是我们运行shell时的bash进程,如果把这个bash进程给杀掉,那么就会发现我们与服务器的链接也会断开

 

 

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

闻 术

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值