昨天,好好看了看有僵尸进程模块的代码,发现调用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);
-
-
- 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);
-
-
- 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]"产生的原因.还是不详!!!!!!!
(yufangbo) |