进程的属性

tips:

task_struct就是linux下的PCB

操作系统不相信任何外部用户,而是只提供窗口,不可能直接与用户打交道,而是通过操作系统

tast_struct用来描述所有进程,用来管理

; 和 && 可以同时跑两个命令

进程可以分为两种

一种跑完自动退        

一种要用户自己退出       常驻进程

PID

,进程的标识码,与其他进程区分

同一程序,关闭又打开后PID会变

但同一次启动中,PID是保持不变的

库函数获取自己pid

库函数头文件:sys/types.h

pid_t getpid(void)

pid_t getppid(void)

kill -9  pid              结束进程

ps ajs 查看所有进程

根目录下proc目录

会根据实际进程情况实时更新

/proc目录不是磁盘级文件

关闭电脑,/proc数据会消失

启动电脑,/proc会重新加载

/proc目录不存储在磁盘,不占用磁盘空间,而是在内存,只是在磁盘提供了类似快捷方式的引用。

/proc/[pid]  存放了进程属性

exe属性相当于getppid返回值

cwd属性,

非常重要

current work dir  当前工作目录

cwd记录进程文件启动时路径

chdir(newdir) 更改本程序cwd为dir

多进程

命令行中,执行命令/程序,本质是bash进程,创建的子进程,子进程执行了我们的代码

xshell开了几个窗口,就有几个bash

fork

是个库函数, 要systypes.h头文件

使用系统调用,创建进程

pid_t fork(void)

fork后,会变成两个进程,两个进程为父子关系,代码是共享的,数据是各自私有一份的

fork在父子进程中返回值不同

进程=内核数据结构+代码和数据

fork后子进程会继承父进程代码(代码共享)

进程间数据独立,保证了进程间互不干扰,有很强独立性,即便是父子,即使是全局变量。

创建多进程,多进程间应为一父对多子,这样父可有多子的pid,方便管理

创建多进程demo

#include <iostream>
#include <vector>
#include <sys/types.h>
#include <unistd.h>
using namespace std;

const int num = 10;


void SubProcessRun()
{
    while(true)
    {
        cout << "I am sub process, pid: " <<getpid() <<" ,ppid: " << getppid() << std::endl;
        sleep(5);
    }
}

int main()
{
    vector<pid_t> allchild;
    for(int i = 0; i<num; i++)
    {
        pid_t id = fork();
        if(id == 0)
        {
            // 子进程
            SubProcessRun();
        }
        // 这里谁执行?父进程一个人
        allchild.push_back(id);
    }

    // 父进程
    cout << "我的所有的孩子是:";
    for(auto child: allchild)
    {
        cout << child << " ";
    }
    cout << endl;

    sleep(10);
    while(true)
    {
        cout << "我是父进程,pid: " <<getpid() << endl;
        sleep(1);
    }
    return 0;
}

理解创建子进程

创建子进程时,子进程的task_struct是拷贝自父进程的,之后调整新的task_struct部分属性

板书

pid属性:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值