再谈僵尸进程

来源:互联网 发布: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]"产生的原因.还是不详!!!!!!!

原创粉丝点击