您的位置:首页 > 运维架构 > Linux

Linux的僵尸进程处理2

2016-05-03 09:45 567 查看
linux下的僵尸进程处理例子,同时也演示了管道通信的弊端

/*************************************************************************
> File Name: ft.c
> Author: zhoulin
> Mail: 715169549@qq.com
> Created Time: Fri Mar 25 15:21:00 2016
************************************************************************/

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
void deal(int sig){
fprintf(stdout,"        *******cur %d exit*******\n",getpid()); //Ctrl+C的发送信号的处理(SIGINT信号)
exit(1);
}
int main(void)
{
pid_t f;
int fd[2]; //管道通信,ffd[0]用于读,fd[1]用于写
if(pipe(fd) <0){
perror("pipe");
return -1;
}
f= fork();
if(f < 0){
perror("fork");
return -1;
}
if(f > 0){
char buf[32] = {'\0'};
signal(SIGINT,&deal); //信号注册
while(1)
{
memset(buf,'\0',32);
fprintf(stdout,"        ******parent %d********\n",getpid());
system("ps -ef |grep -v 'grep'|grep -v 'ksoftirqd'|grep 'ft'");
sleep(1);
close(fd[1]);
if(read(fd[0],buf,32) < 0) //接受子进程过来的信息
{
perror("read");
return -1;
}
if(strlen(buf) > 0){
fprintf(stdout,"    ----------------%s-------------\n",buf);
if(strncmp(buf,"active",6) == 0){
fprintf(stdout,"        *****child is running*****\n");
}
if(strncmp(buf+6,"die",3) == 0) {
fprintf(stdout,"        *****child is die*****\n");
system("ps -ef |grep -v 'grep'|grep -v 'ksoftirqd'|grep 'ft'");
int status;
fprintf(stdout,"    ****recyle child %d******\n",wait(&status));
}
}
}
}else {
int i = 0;
while(1){
close(fd[0]);
fprintf(stdout,"        ******child %d********\n",getpid());
system("ps -ef |grep -v 'grep'|grep -v 'ksoftirqd'|grep 'ft'");
sleep(1);
i++;
if(i == 3){
fprintf(stdout,"        #####child exit#####\n");
write(fd[1],"die",3); //发送消息给父进程,要推出啦
exit(0);
}
if(write(fd[1],"active",6) < 0){
perror("write");
return -1;
}
}
}
return 0;
}


 

运行结果:

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: