卡盟怎么做网站,千页网素材官网入口,做视频网站版权怎么解决,wordpress 关闭畅言fork复制进程之后#xff0c;会产生一个进程叫做子进程#xff0c;被复制的进程就是父进程。不管父进程先结束#xff0c;还是子进程先结束#xff0c;对另外一个进程完全没有影响#xff0c;父进程和子进程是两个不同的进程。
一、孤儿进程
现在有以下代码#xff1a;…fork复制进程之后会产生一个进程叫做子进程被复制的进程就是父进程。不管父进程先结束还是子进程先结束对另外一个进程完全没有影响父进程和子进程是两个不同的进程。
一、孤儿进程
现在有以下代码 【注意】 上述代码中调用getpid()输出当前进程的pid调用getppid()输出当前进程的父进程的pid。
让子进程执行7次父进程执行3次编译并运行结果如下 分析当父进程执行完3次之后子进程的父进程结束子进程就变为了孤儿进程孤儿进程会被系统中的inti(pid1)收养但是在目前有些系统中也会被随机的其他进程收养。例如上图中父进程执行完3次之后父进程结束子进程就变为了孤儿进程该孤儿进程的父进程的id就变成了1145说明该孤儿进程的父进程变为了pid为1145的一个进程。
二、僵死进程
僵死进程子进程先与父进程结束父进程没有获取子进程的退出码子进程就变成了僵死进程。
有以下代码 编译以上代码并在后台运行运行的时候通过ps查看进程信息结果如下 分析
由结果可以看出当子进程结束之后通过ps查看进程信息的时候还是可以看到子进程的信息只不过子进程后边加了一个注释defunct表示该子进程变成了僵死进程僵死进程就是表示代码已经结束了是已经结束的进程这个进程在以后再也不会执行了。按道理子进程在结束了之后不应该还能看到这个进程也就是说这个子进程本来应该已经死掉了但是我们还能看到它这是不合理的。
我们之所以还能看到这个子进程僵死进程是因为子进程比父进程先结束父进程没有获取子进程的退出码该子进程就变成了僵死进程。
所谓退出码是存放到PCB中的当子进程结束之后如果父进程没有获取子进程的退出码那么子进程的PCB就不会消失会一直存在所以在子进程结束之后再查看进程信息的时候就还能看到子进程的信息但是这个子进程已经是僵死进程了。如果一个进程不断产生子进程子进程结束后也没有获取子进程的退出码那么这些子进程就会变成僵死进程僵死进程就会越来越多那么内核空间的内存就会被逐渐耗光而且僵死进程会占用着PID不释放那么这个PID就无法被复用软件层面的资源也被占着。
三、处理僵死进程
父进程获取子进程的退出码僵死进程就会消失。这一步要通过父进程调用wait()来完成。wait()可以获取子进程的退出码处理僵死进程。
代码如下 运行结果如下
①在前台运行 根据运行结果可以看出一开始只有子进程在执行因为父进程中执行了wait子进程执行的时候由于wait阻塞住了父进程子进程执行结束之后父进程才开始执行也就是说父进程在等待子进程结束。
代码中可以看到无论父进程还是子进程退出码的值都为但是运行结果中val的值并不是而是768这是因为int型变量占个字节将换算为二进制数之后为11这个11并不会存在第一个字节的起始位置而是会在个字节中的任意位置。如下图所示把768转换为二进制数为0011 0000 0000 将val的值向右移动个位将代码中的printf(val%d\n,val);改为printf(val%d\n,val8);之后再编译运行val的值的结果就是了如下图所示 ②在后台运行
运行结果 作为父进程要关注有自己产生的子进程不能让它们变为僵死进程。
如果父进程比子进程先结束父进程没有通过wait处理结束的子进程子进程变为了僵死进程等到父进程结束以后此时不管子进程活着还是死掉了就会给子进程重新找一个父进程让这个另外的进程来收养子进程另外的进程来收养子进程的意义就在于这个收养子进程的父进程就会接管这个子进程然后执行wait获取该子进程的退出码那么即便收养的子进程已经结束变成了僵死进程通过收养它的父进程来执行wait这个僵死进程就消失了。