生成僵尸进程
来源:互联网 发布:汽车电脑编程叫什么 编辑:程序博客网 时间:2024/04/30 10:29
定义:
In UNIX System terminology, a process that has terminated,but whose parent has not yet waited for it, is called a zombie. 在UNIX 系统中,一个进程结束了,但是他的父进程没有等待(调用wait / waitpid)他, 那么他将变成一个僵尸进程. 但是如果该进程的父进程已经先结束了,那么该进程就不会变成僵尸进程, 因为每个进程结束的时候,系统都会扫描当前系统中所运行的所有进程, 看有没有哪个进程是刚刚结束的这个进程的子进程,如果是的话,就由Init 来接管他,成为他的父进程
那就来看看,怎么样能够产生这种进程吧。
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
int main()
{
pid_t pid;
int i;
pid = fork();
if (pid == 0)
{
printf("Child Process:/n");
printf("pid: %d/n", getpid());
printf("ppid: %d/n", getppid());
printf("uid: %d/n", getuid());
printf("euid: %d/n", geteuid());
printf("gid: %d/n", getgid());
printf("egid: %d/n", getegid());
return -1;
}
else
printf("Parent Process:/n");
printf("pid: %d/n", getpid());
printf("ppid: %d/n", getppid());
printf("uid: %d/n", getuid());
printf("euid: %d/n", geteuid());
printf("gid: %d/n", getgid());
printf("egid: %d/n", getegid());
for(i=0; i<10; i++)
sleep(10);
return 0;
}
这段代码运行结果:
$./test
Child Process:
pid: 8732
ppid: 8731
uid: 500
euid: 500
gid: 514
egid: 514
Parent Process:
pid: 8731
ppid: 14644
uid: 500
euid: 500
gid: 514
egid: 514
显示父进程和子进程都运行起来了,但是子进程其实已经退出。
那现在来显示进程状态。
$ps Uwyang | grep test
7835 ? Ss 0:01 gvim test.c
8731 pts/53 S+ 0:00 ./test
8732 pts/53 Z+ 0:00 [test] <defunct>
8734 pts/32 S+ 0:00 grep test
看到红颜色的就是我们的进程。 父进程还活着,而子进程已经是Z状态了,表示已经是僵尸进程了。
过了100秒后,父进程也退出后。
$ps Uwyang | grep test
32093 pts/53 S+ 0:00 grep test
可以看到,父进程和子进程都没有了。
是init接管了子进程,还是父进程清理了呢?
想了想,还是应该init接管,清理掉的。
因为父进程不知道子进程的信息。
- 生成僵尸进程
- 僵尸进程
- 僵尸进程
- 僵尸进程
- 僵尸进程
- 僵尸进程
- 僵尸进程
- 僵尸进程
- 僵尸进程
- 僵尸进程
- 僵尸进程
- 僵尸进程
- 僵尸进程
- 僵尸进程
- 僵尸进程
- 僵尸进程
- 僵尸进程
- 僵尸进程
- 服务器双电源
- IT行业的出路
- MYSQL的函数功能
- [转]unresolved external symbol _main referenced in function ___tmainCRTStartup 问题的解决
- Excel匯入匯出整理
- 生成僵尸进程
- XP.CMD命令大全
- 1260 Pearls
- Facebook曝泄露门:1亿用户资料现身网络
- 实现折线测距功能
- 保存类中变量或属性到XML配置文件
- C第一篇博客
- 保存类中变量或属性到XML配置文件
- 保存类中变量或属性到XML配置文件