这个可以程序主要测试高级并发服务器程序怎样写会避免僵尸进程?

#include <unistd.h>
#include <stdio.h>
#include<stdlib.h>
#include<signal.h>
int main(void)
{  //signal(SIGCHLD, SIG_IGN);
   int i=0;
   printf("i son/pa ppid pid  fpid\n");
   //ppid指当前进程的父进程pid
   //pid指当前进程的pid,
   //fpid指fork返回给当前进程的值
   while(1){
   sleep(1);                           //之所以加入这个时间是因为,容易看出程序的变化,不然根本看不出变化,连鼠标都懂不了!
       pid_t fpid=fork();
       if(fpid==0)
           {printf("%d child  %4d %4d %4d\n",i,getppid(),getpid(),fpid);
            //return 0; //这两个效果一样的!
            exit(0);
            }
         }
return 0;
}
[[email protected] Desktop]# gcc b.c
[[email protected] Desktop]# ./a.out
i son/pa ppid pid  fpid
0 child  16980 16981    0
0 child  16980 16982    0
0 child  16980 16983    0
0 child  16980 16985    0
0 child  16980 16988    0
0 child  16980 16990    0
0 child  16980 16991    0
0 child  16980 16993    0
0 child  16980 16995    0
0 child  16980 16996    0
^C
[[email protected] Desktop]# 

[[email protected] Desktop]# ps aux | grep -w ‘Z‘               //产生了好多僵尸进程了
root     16981  0.0  0.0      0     0 pts/2    Z+   20:38   0:00 [a.out] <defunct>
root     16982  0.0  0.0      0     0 pts/2    Z+   20:38   0:00 [a.out] <defunct>
root     16983  0.0  0.0      0     0 pts/2    Z+   20:38   0:00 [a.out] <defunct>
root     16985  0.0  0.0      0     0 pts/2    Z+   20:38   0:00 [a.out] <defunct>
root     16987  0.0  0.0   4340   804 pts/3    S+   20:38   0:00 grep -w Z
[[email protected] Desktop]# 

当把signal(SIGCHLD, SIG_IGN);这行代码加上时输出结果如下:
[[email protected] Desktop]# gcc b.c
[[email protected] Desktop]# ./a.out
i son/pa ppid pid  fpid
0 child  17135 17136    0
0 child  17135 17137    0
0 child  17135 17139    0
0 child  17135 17140    0
0 child  17135 17141    0
0 child  17135 17142    0
0 child  17135 17145    0
0 child  17135 17147    0
0 child  17135 17150    0
0 child  17135 17151    0
0 child  17135 17152    0
^C
[[email protected] Desktop]#                     //没有僵尸进程产生
[[email protected] Desktop]# ps aux | grep -w ‘Z‘
root     17144  0.0  0.0   4336   796 pts/3    S+   20:42   0:00 grep -w Z
[[email protected] Desktop]# ps aux | grep -w ‘Z‘
root     17149  0.0  0.0   4336   792 pts/3    S+   20:42   0:00 grep -w Z
[[email protected] Desktop]# 
时间: 2024-11-03 22:59:39

这个可以程序主要测试高级并发服务器程序怎样写会避免僵尸进程?的相关文章

服务器并发处理的时候如何避免僵尸进程的产生

当服务器处理多个请求链接的时候,常用的做法是收到一个请求,服务器就fork一个子进程, 如果父进程调用wait函数处理子进程结束时的状态信息,那么wait函数必须等待子进程的 结束,这时同一时刻服务器就只能处理一个请求,如果考虑不使用wait函数,那么接受一个 请求,结果就会产生一个僵尸进程,因为父进程一直fork,init进程也无法接管结束的子进 程,这时候,因为一台服务器产生的进程数是有限的,不是无限的,而僵尸进程有必然会占 据一个进程号,所以僵尸进程数目一定多的时候,会造成无法再处理新的请

第十二章:并发程序的测试——Java并发编程实战

并发程序中潜在错误的发生并不具有确定性,而是随机的. 安全性测试:通常会采用测试不变性条件的形式,即判断某个类的行为是否与其规范保持一致 活跃性测试:进展测试和无进展测试两方面,这些都是很难量化的(性能:即吞吐量,响应性,可伸缩性测试) 一.正确性测试 重点:找出需要检查的不变性条件和后验条件 1.对基本单元的测试--串行的执行 1 public class BoundedBufferTests { 2 3 @Test 4 public void testIsEmptyWhenConstruct

第四章 基本TCP套接字编程 第五章 TCP客户/服务器程序实例

TCP客户与服务器进程之间发生的重大事件时间表 TCP服务器 socket() --- bind() --- listen() --- accept() --- read() --- write --- read() --- close TCP客户 socket() --- connect() --- write() --- read()  --- close() 套接字函数简介 int socket(int family, int type, int protocol); 指定要用的通信协议类

并发服务器

本文摘自<UNIX网络编程 卷1>. fork和exec函数 fork函数是Unix/Linux中派生新进程的唯一方法.其定义如下: #include <unistd.h> pid_t fork(void); // 返回:若成功则在子进程中返回0,在父进程中返回子进程ID,若出错则返回-1 fork函数调用一次,返回两次.它在调用进程(称为父进程)中返回一次,返回值是新派生进程(称为子进程)的进程ID号:在子进程中返回一次,返回值为0.因此,返回值本身告知当前进程是子进程还是父进程

使用事件驱动模型实现高效稳定的网络服务器程序

使用事件驱动模型实现高效稳定的网络服务器程序 几种网络服务器模型的介绍与比较 围绕如何构建一个高效稳定的网络服务器程序,本文从一个最简单的服务器模型开始,依次介绍了使用多线程的服务器模型.使用非阻塞接口的服务器模型.利用select()接口实现的基于事件驱动的服务器模型,和使用libev事件驱动库的服务器模型.通过比较各个模型,得出事件驱动模型更适合构建高效稳定的网络服务器程序的结论. 前言 事件驱动为广大的程序员所熟悉,其最为人津津乐道的是在图形化界面编程中的应用:事实上,在网络编程中事件驱动

关于如何有效避免僵尸进程的一种探索。(动手写自己的http服务器)

关于如何避免僵尸进程.其实方法很多.有很多现成的解决方案.这里给出一个简单的方案.以及背后思考的过程. 设想一种最简单的http服务器: 伪代码: 当接收到一个tcp请求的时候. fork 一个子进程去做工作. 主进程依旧在监听下面要来的请求. 这个模型实际上会导致.因为fork出来的子进程没有回收,并且父进程一直存在没有结束.导致越来越多的僵尸进程出现. 都知道子进程结束的时候会发一个sigchld信号给父进程.于是改进成增加一行代码: signal(SIGCHLD,deal_signal);

服务器程序压力测试、性能测试

负载生成器是一些生成用于测试的流量的程序.它们可以向你展示服务器在高负载的情况下的性能,以及让你能够找出服务器可能存在的问题.为了得到更加客观和准确的数值,应该从远程访问.局域网访问和本地等多个方面进行全方位的测试.一般用127.0.0.1进行本机测试 Apache Benchmark ab命令会创建很多的并发访问线程,模拟多个访问者同时对某一URL进行访问,可用来测试Apache的负载压力,也可以测试nginx.lighthttp.IIS等其它Web服务器的压力. 1. 安装 Unix安装 y

《java并发编程实战》读书笔记9--并发程序的测试

第12章 并发程序的测试 大致分为两类:安全性测试和活跃性测试 12.1 正确性测试 找出需要检查的不变性条件和后验条件.接下来将构建一组测试用例来测试一个有界缓存.程序清单12-1给出了BoundedBuffer的实现,其中使用Semaphore来实现缓存的有界属性和阻塞行为. BoundedBuffer实现了一个固定长度的队列,其中定义了可阻塞的put和take方法,并通过两个计数信号量进行控制.(实际情况中如果需要一个有界缓存,应该直接使用ArrayBlockingQueue或者Linke

这个模型用来测试并发服务器,是否会产生僵尸进程

#include <unistd.h> #include <stdio.h> #include<signal.h> int main(void) { signal(SIGCHLD, SIG_IGN); //一般来说在做并发服务器的时候,都要将这个加上!可以防止因为子进程退出时,父进程没时间处理,而产生僵尸进程! int i=0; printf("i son/pa ppid pid fpid\n"); //ppid指当前进程的父进程pid //pid指