再谈僵尸进程
来源:互联网 发布:debian ubuntu 编辑:程序博客网 时间:2024/05/18 16:19
昨天,好好看了看有僵尸进程模块的代码,发现调用POPEN后还是有PCLOSE关掉的,可为什么还有那个SHELL"僵尸"掉呢,实在搞不懂,今晚,做是实验:
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/time.h>
void set_STIMER(int s1) {
struct itimerval value1;
if (s1 > 0) {
value1.it_value.tv_sec = s1;
value1.it_value.tv_usec = 0;
value1.it_interval = value1.it_value;
} else {
value1.it_value.tv_sec = (0 * 1000);
value1.it_value.tv_usec = 0;
value1.it_interval = value1.it_value;
}
setitimer(ITIMER_REAL, &value1, NULL);
}
void use_popen ()
{
FILE * pFile;
char * buffer;
size_t result;
pFile = popen ( "date" , "r" );
if (pFile==NULL)
{
fputs ("File error",stderr);
exit (1);
}
buffer = (char*) malloc (1024);
if (buffer == NULL)
{
fputs ("Memory error",stderr);
exit (2);
}
fread (buffer,sizeof(char),256,pFile);
printf("%s/n",buffer);
// fclose (pFile);//注:没有PCLOSE
free (buffer);
}
void init_sigaction()
{
struct sigaction act;
act.sa_handler=use_popen;
act.sa_flags=0;
sigemptyset(&act.sa_mask);
sigaction(SIGALRM, &act, NULL);
}
int main(int argc, char *argv[])
{
init_sigaction();
set_STIMER(5);
while (1)
{
system("exec ps");
sleep (10);
}
return 0;
}
运行结果:
四 9月 18 19:02:07 CST 2008
PID TTY TIME CMD
3278 pts/0 00:00:00 bash
3341 pts/0 00:00:00 z
3345 pts/0 00:00:00 date <defunct>
3349 pts/0 00:00:00 date <defunct>
3353 pts/0 00:00:00 date <defunct>
3357 pts/0 00:00:00 date <defunct>
3361 pts/0 00:00:00 date <defunct>
3365 pts/0 00:00:00 date <defunct>
3369 pts/0 00:00:00 date <defunct>
3373 pts/0 00:00:00 date <defunct>
3374 pts/0 00:00:00 ps
四 9月 18 19:02:12 CST 2008
PID TTY TIME CMD
3278 pts/0 00:00:00 bash
3341 pts/0 00:00:00 z
3345 pts/0 00:00:00 date <defunct>
3349 pts/0 00:00:00 date <defunct>
3353 pts/0 00:00:00 date <defunct>
3357 pts/0 00:00:00 date <defunct>
3361 pts/0 00:00:00 date <defunct>
3365 pts/0 00:00:00 date <defunct>
3369 pts/0 00:00:00 date <defunct>
3373 pts/0 00:00:00 date <defunct>
3377 pts/0 00:00:00 date <defunct>
3378 pts/0 00:00:00 ps
四 9月 18 19:02:17 CST 2008
PID TTY TIME CMD
3278 pts/0 00:00:00 bash
3341 pts/0 00:00:00 z
3345 pts/0 00:00:00 date <defunct>
3349 pts/0 00:00:00 date <defunct>
3353 pts/0 00:00:00 date <defunct>
3357 pts/0 00:00:00 date <defunct>
3361 pts/0 00:00:00 date <defunct>
3365 pts/0 00:00:00 date <defunct>
3369 pts/0 00:00:00 date <defunct>
3373 pts/0 00:00:00 date <defunct>
3377 pts/0 00:00:00 date <defunct>
3381 pts/0 00:00:00 date <defunct>
3382 pts/0 00:00:00 ps
四 9月 18 19:02:22 CST 2008
PID TTY TIME CMD
3278 pts/0 00:00:00 bash
3341 pts/0 00:00:00 z
3345 pts/0 00:00:00 date <defunct>
3349 pts/0 00:00:00 date <defunct>
3353 pts/0 00:00:00 date <defunct>
3357 pts/0 00:00:00 date <defunct>
3361 pts/0 00:00:00 date <defunct>
3365 pts/0 00:00:00 date <defunct>
3369 pts/0 00:00:00 date <defunct>
3373 pts/0 00:00:00 date <defunct>
3377 pts/0 00:00:00 date <defunct>
3381 pts/0 00:00:00 date <defunct>
3385 pts/0 00:00:00 date <defunct>
3386 pts/0 00:00:00 ps
四 9月 18 19:02:27 CST 2008
PID TTY TIME CMD
3278 pts/0 00:00:00 bash
3341 pts/0 00:00:00 z
3345 pts/0 00:00:00 date <defunct>
3349 pts/0 00:00:00 date <defunct>
3353 pts/0 00:00:00 date <defunct>
3357 pts/0 00:00:00 date <defunct>
3361 pts/0 00:00:00 date <defunct>
3365 pts/0 00:00:00 date <defunct>
3369 pts/0 00:00:00 date <defunct>
3373 pts/0 00:00:00 date <defunct>
3377 pts/0 00:00:00 date <defunct>
3381 pts/0 00:00:00 date <defunct>
3385 pts/0 00:00:00 date <defunct>
3389 pts/0 00:00:00 date <defunct>
3390 pts/0 00:00:00 ps
很明显,有僵尸进程产生
用FCLOSE关掉POPEN 打开的文件
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/time.h>
void set_STIMER(int s1) {
struct itimerval value1;
if (s1 > 0) {
value1.it_value.tv_sec = s1;
value1.it_value.tv_usec = 0;
value1.it_interval = value1.it_value;
} else {
value1.it_value.tv_sec = (0 * 1000);
value1.it_value.tv_usec = 0;
value1.it_interval = value1.it_value;
}
setitimer(ITIMER_REAL, &value1, NULL);
}
void use_popen ()
{
FILE * pFile;
char * buffer;
size_t result;
pFile = popen ( "date" , "r" );
if (pFile==NULL)
{
fputs ("File error",stderr);
exit (1);
}
buffer = (char*) malloc (1024);
if (buffer == NULL)
{
fputs ("Memory error",stderr);
exit (2);
}
fread (buffer,sizeof(char),256,pFile);
printf("%s/n",buffer);
fclose (pFile);
free (buffer);
}
void init_sigaction()
{
struct sigaction act;
act.sa_handler=use_popen;
act.sa_flags=0;
sigemptyset(&act.sa_mask);
sigaction(SIGALRM, &act, NULL);
}
int main(int argc, char *argv[])
{
init_sigaction();
set_STIMER(5);
while (1)
{
system("exec ps");
sleep (10);
}
return 0;
}
[root@lanhai-linux popen]# PID TTY TIME CMD
3278 pts/0 00:00:00 bash
3429 pts/0 00:00:00 p
3430 pts/0 00:00:00 ps
四 9月 18 19:02:58 CST 2008
PID TTY TIME CMD
3278 pts/0 00:00:00 bash
3429 pts/0 00:00:00 p
3432 pts/0 00:00:00 ps
没有僵尸进程产生
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/wait.h>
void set_STIMER(int s1) {
struct itimerval value1;
if (s1 > 0) {
value1.it_value.tv_sec = s1;
value1.it_value.tv_usec = 0;
value1.it_interval = value1.it_value;
} else {
value1.it_value.tv_sec = (0 * 1000);
value1.it_value.tv_usec = 0;
value1.it_interval = value1.it_value;
}
setitimer(ITIMER_REAL, &value1, NULL);
}
void use_popen ()
{
FILE * pFile;
char * buffer;
size_t result;
pFile = popen ( "date" , "r" );
if (pFile==NULL)
{
fputs ("File error",stderr);
exit (1);
}
buffer = (char*) malloc (1024);
if (buffer == NULL)
{
fputs ("Memory error",stderr);
exit (2);
}
fread (buffer,sizeof(char),256,pFile);
printf("%s/n",buffer);
// fclose (pFile);
free (buffer);
}
void init_sigaction()
{
struct sigaction act;
act.sa_handler=use_popen;
act.sa_flags=0;
sigemptyset(&act.sa_mask);
sigaction(SIGALRM, &act, NULL);
}
void process_zombie()
{
pid_t pid;
int stat;
while((pid = waitpid(-1, &stat, WNOHANG)) > 0);
return;
}
//
void init_sigaction2()
{
struct sigaction act;
act.sa_handler=process_zombie;
act.sa_flags=0;
sigemptyset(&act.sa_mask);
sigaction(SIGCHLD, &act, NULL);
}
int main(int argc, char *argv[])
{
init_sigaction();
set_STIMER(5);
init_sigaction2();
while (1)
{
system("exec ps");
sleep (10);
}
return 0;
}
PID TTY TIME CMD
3278 pts/0 00:00:00 bash
3493 pts/0 00:00:00 pz
3506 pts/0 00:00:00 ps
四 9月 18 19:04:36 CST 2008
PID TTY TIME CMD
3278 pts/0 00:00:00 bash
3493 pts/0 00:00:00 pz
3508 pts/0 00:00:00 ps
也没有产生僵尸进程
对于那个用WAITPID才能"收拾"掉的"[sh]"产生的原因.还是不详!!!!!!!
- 再谈僵尸进程
- 也谈僵尸进程
- 也谈孤儿进程与僵尸进程
- 僵尸进程
- 僵尸进程
- 僵尸进程
- 僵尸进程
- 僵尸进程
- 僵尸进程
- 僵尸进程
- 僵尸进程
- 僵尸进程
- 僵尸进程
- 僵尸进程
- 僵尸进程
- 僵尸进程
- 僵尸进程
- 僵尸进程
- 实用生活英语句子 174句
- 反射
- office VBA开发视频教程
- LINUX下SOCKET连接
- Linux下Socket编程
- 再谈僵尸进程
- 用Visual Studio 2008开发IE BHO (浏览器帮助对象)之一
- 关于递归(recursion)的总结
- 处理僵尸进程
- struts2中文乱码解决方法
- 我来谈谈中国的程序员和外国的程序员
- 实现 JScrollPane 自动滚动
- web server的初次认识
- 简/繁体转化