美文网首页
linux内核编程-进程创建与进程管理

linux内核编程-进程创建与进程管理

作者: Peakmain | 来源:发表于2019-10-10 11:24 被阅读0次

pcb进程控制块

pcb本身是一个结构体(sched.h):

struct task_struct{
    volatile long state;
    void *stack;
    atomic_t usage;
    unsigned int flags;
    unsigned int ptrace;
    //进程id
    //文件描述符
    //进程的状态:初始态,就绪状态,运行状态,挂起状态,终止状态
    //进程工作目录
    //信号相关信息资源
    //用户id组id
}

内存映射

用户空间映射:会映射到不同区域
内核空间映射:会映射到同一区域不同地方(没有隔离)


内存映射.png

fork创建子线程

  pid_t fork(void);
fork函数.png
  • 首先父fork之前的代码->父fork代码->父fork之后的代码->子fork的代码->子fork之后的代码
  • getpid:获取当前进程的pid
  • getppid:获取父进程的pid
#include<stdio.h>
#include<unistd.h>
int main(int argc,const char *argv[]){
    printf("fork before\n");
    pid_t pid= fork();
    if(pid==-1){
        printf("fork error");
    }
    if(pid==0){
        printf("I am child processs!,pid=%d,ppid=%d\n",getpid(),getppid());
    }else{
        printf("I am parent,cpid = %d,pid=%d,ppid=%d\n",pid,getpid(),getppid());
    }
    printf("fork after\n");
    return 0;
}

父进程共享

  • 父子进程相同
    刚fork后,data段,text段,堆,栈,全局变量,宿主程序目录,进程工作目录,信号处理方式。
  • 父子进程不同
    进程id,返回值,各自的父进程,进程创建的时间,闹钟,未决信号集
  • 父子进程共享
    map映射区,读时共享,写时复制
#include<stdio.h>
#include<unistd.h>
int main(int argc,const char *argv[]){
    printf("fork before\n");
    pid_t pid= fork();
    int num=200;
    if(pid==-1){
        printf("fork error");
    }
    if(pid==0){
        //num=300;
        printf("I am child processs!,pid=%d,ppid=%d\n",getpid(),getppid());
    }else{
        num=400;
        printf("I am parent,cpid = %d,pid=%d,ppid=%d\n",pid,getpid(),getppid());
    }
    printf("num = %d\n",num);
    printf("fork after\n");
    return 0;
}

进程回收

  • 孤儿进程:父进程先于子进程结束则子进程会成为孤儿进程,子进程的父进程称为init进程(进程孤儿院)来回收进程-
  • 僵尸进程:子进程结束,父进程尚未回收,改子进程变成僵尸编程
  • 进程回收:回收的是残留在内核3-4G的数据(pcb控制块)
  • wait功能
    1、阻塞等待子线程退出
    2、回收子线程残留的资源
    3、获取子线程退出的状态

回收多个子线程,需要while循环

监听App被应用卸载

5.0以前是可以的
1、fork一个子线程
2、监听文件是否被删除,data/data/xx包名
3、exec函数执行某行命令(打开浏览器收集反馈)

//可以执行自己写好的程序,path是路径,arg0是可变的参数
 int execle(const char *path, const char *arg0, ...
         /*, (char *)0, char *const envp[] */);
 //可以走系统的程序
  int execlp(const char *file, const char *arg0, ... /*, (char *)0 */);

不会走原来的fork之后text字段,而是去执行exec函数族的命令或者程序

相关文章

网友评论

      本文标题:linux内核编程-进程创建与进程管理

      本文链接:https://www.haomeiwen.com/subject/oobwpctx.html