java 僵尸进程_僵尸进程 - Java教程 - 找一找教程网

1. 关于fork

fork()函数:

用于创建一个进程,所创建的进程复制父进程的代码段/数据段/BSS段/堆/栈等所有用户空间信息;在内核中操作系统重新为其申请了一个PCB,并使用父进程的PCB进行初始化;

对于父进程而言,fork()函数返回子进程的ID(子进程的PID);而对于子进程而言,fork函数返回0。

僵尸进程

父进程创建子进程后,子进程运行到终止时刻(例如,调用exit()函数,或者运行到main中的return语句时,都会将返回的值传递给 操作系统),此时如果父进程还在运行,子进程并不会立即被销毁,直到这些值传到了产生该子进程的父进程。也就是说,如果父进程没有主动要求获得子进程的结束状态值,操作系统就会一直保存该进程的相关信息,并让子进程长时间处于僵尸状态,例如下面程序:

此时,运行该程序,查看后台进程可知(test16是该测试程序的名称,defunct表示僵尸进程):

gqx@gqx-Lenovo-Product:~$ ps -au

USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND

root 923 0.6 0.9 480840 159824 tty7 Ssl+ 4月09 36:07 /usr/lib/xorg/

root 1351 0.0 0.0 17676 1768 tty1 Ss+ 4月09 0:00 /sbin/agetty -

...

gqx 24856 0.0 0.0 0 0 pts/11 Z+ 11:03 0:00 [tes16]

gqx 24859 0.0 0.0 39104 3300 pts/3 R+ 11:03 0:00 ps -au

僵尸进程的消除

方法一:调用wait()函数:

/* Wait for a child to die. When one does, put its status in *STAT_LOC

and return its process ID. For errors, return (pid_t) -1.

This function is a cancellation point and therefore not marked with

__THROW. */

extern __pid_t wait (__WAIT_STATUS __stat_loc);

成功返回终止的进程ID,失败返回-1;子进程的最终返回值将指向该函数参数所指向的内存空间,但函数所指向的内存单元总还含有其他的信息,需要使用宏进行分离。

# define WIFEXITED(status) __WIFEXITED (__WAIT_INT (status)) //子进程正常终止返回"true"

# define WEXITSTATUS(status) __WEXITSTATUS (__WAIT_INT (status)) //返回子进程的返回值

要注意的是:如果没有已终止的子进程,那么程序将被阻塞,直到有子进程终止。

方法二:调用waitpid()函数

/* Wait for a child matching PID to die.

If PID is greater than 0, match any process whose process ID is PID.

If PID is (pid_t) -1, match any process.

If PID is (pid_t) 0, match any process with the

same process group as the current process.

If PID is less than -1, match any process whose

process group is the absolute value of PID.

If the WNOHANG bit is set in OPTIONS, and that child

is not already dead, return (pid_t) 0. If successful,

return PID and store the dead child's status in STAT_LOC.

Return (pid_t) -1 for errors. If the WUNTRACED bit is

set in OPTIONS, return status for stopped children; otherwise don't.

This function is a cancellation point and therefore not marked with

__THROW. */

extern __pid_t waitpid (__pid_t __pid, int *__stat_loc, int __options);

第一个参数:如果__pid的值是-1,则与wait()函数相同,可以等待任意的子程序终止;如果是0,则等待进程组识别码与目前进程相同的任何子进程;如果pid>0,则等待任何子进程识别码为 pid 的子进程。

第二个参数:与前一个函数wait()的参数意义相同。

第三个参数:常用WNOHANG——若pid指定的子进程没有结束,则waitpid()函数返回0,不予以等待。若结束,则返回该子进程的ID。

示例程序如下:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值