C++ 进程相关

PCB 进程控制块

 

 

getenv 获取环境变量

 

 

 

 

 

 

 

 

 父进程先死,子进程变为孤儿。

 

 

 加sleep,让父进程最后死。

 

 

查看进程信息:

ps aux

有ppid信息:

ps ajx

杀死进程:

kill -9 pid

kill表示给进程发信号,-9表示发9号信号

kill -l 查看信号信息

 

生5个子进程

 

 

精确控制失去几号子进程

 

 

 

父子进程间遵循读时共享,写时复制的原则,节省内存开销。

即使是全局变量,也不是共享的,读时共享,写时就复制了。

 

 

 

 

 

 

 

 

execl execlp

 

 底层把代码段替换了。进程ID不变。换核不换壳。

 

 

 

 

execl 需要加路径

 

 

 

 

 

 孤儿进程

 

 

 

 

僵尸

 

 

 

 

 

子进程已经死了,但是没有被回收,所以称为僵尸进程。

解决:杀死父进程,init会领养它,并负责回收它。

 

 

wait 函数

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 (没有回收到子进程,waitpid直接return了)

 

 

 (可以回收到)

 

 

 

 

 

 

回收n个子进程

 

 


用waitpid实现

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

int main()
{
    int i=0;
    pid_t pid;
    for(i=0;i<5;i++){
        pid=fork();
        if(pid==0){
            break;
        }
    }

    if(i==5){
        printf("I am the father\n");
        while(1){
            pid_t wpid=waitpid(-1,NULL,WNOHANG);
            if(wpid==-1){
                break;
            }else if(wpid>0){
                printf("recycle wpid=%d\n", wpid);
            }
        }
        while(1){
            sleep(1);
        }
    }
    else if(i<5){
        sleep(i);
        printf("I am the child, i=%d, pid=%d\n", i, getpid());
    }
    return 0;
}

 

posted @ 2020-03-04 15:53  feibilun  阅读(236)  评论(0编辑  收藏  举报