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

#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指当前进程的pid,
   //fpid指fork返回给当前进程的值
   for(i=0;i<2;i++){
       pid_t fpid=fork();
       if(fpid==0)
           {printf("%d child  %4d %4d %4d\n",i,getppid(),getpid(),fpid);
            while(1); }
       else {
           printf("%d parent %4d %4d %4d\n",i,getppid(),getpid(),fpid);}
   }
   return 0;
}
无论有没有signal(SIGCHLD, SIG_IGN); 这句,产生的两个子进程,输出没有变化
[[email protected] Desktop]# gcc a.c
[[email protected] Desktop]# ./a.out
i son/pa ppid pid  fpid
0 parent 4643 6269 6270
0 child  6269 6270    0
1 child  6269 6271    0
1 parent 4643 6269 6271
[[email protected] Desktop]# ./a.out
i son/pa ppid pid  fpid
0 parent 4643 6422 6423
1 parent 4643 6422 6424
[[email protected] Desktop]# 1 child     1 6424    0
0 child     1 6423    0
//从上面的输出结果可以看出产生的两个子进程都是父进程产生的,分别为6270(i=0)和6271(i=1)两个子进程,按道理来说第二次循环中子进程还可以创建一个子进程,这样就符合规律了,本应该创建3个子进程,但是为啥创建了两个子进程是因为第一次循环时即(i=0)父进程创建的子进程6270陷入了无限循环之中,所以没发在第二次循环中再次创建子进程!这样就可以理解了,为啥只创建一个子进程了!
[[email protected] Desktop]# ps --ppid 1
 6270 pts/6    00:00:18 a.out     //部分截图
 6271 pts/6    00:00:18 a.out
 6423 pts/6    00:00:00 a.out
 6424 pts/6    00:00:00 a.out

#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指当前进程的pid,
   //fpid指fork返回给当前进程的值
   for(i=0;i<2;i++){
       pid_t fpid=fork();
       if(fpid==0)
           {printf("%d child  %4d %4d %4d\n",i,getppid(),getpid(),fpid);
            while(1); }

       else {
           printf("%d parent %4d %4d %4d\n",i,getppid(),getpid(),fpid);}
   }
   while(1);    //这句是必须的不然服务器程序会执行完后会退出程序!这样就不能接到客户端的请求了!
   return 0;
}
[[email protected] Desktop]# gcc a.c
[[email protected] Desktop]# ./a.out
i son/pa ppid pid  fpid
0 parent 2667 2725 2726
1 parent 2667 2725 2727
0 child  2725 2726    0
1 child  2725 2727    0   //注意这儿阻塞住了,可以用ctrl+c输出没有变化

[[email protected] Desktop]# ps aux | grep -w ‘Z‘
root      2709  2.0  0.0   4336   792 pts/2    S+   18:58   0:00 grep -w Z  //注意没有僵尸进程产生
[[email protected] Desktop]#
[[email protected] Desktop]# ps aux | grep -w ‘Z‘
root      2738  0.0  0.0   4336   820 pts/2    S+   18:58   0:00 grep -w Z
[[email protected] Desktop]# 

[[email protected] Desktop]# ps --ppid 1
  PID TTY          TIME CMD
  516 ?        00:00:00 udevd
 1467 ?        00:00:00 vmware-vmblock-
 1487 ?        00:00:01 vmtoolsd
 1617 ?        00:00:00 auditd
 1635 ?        00:00:00 portreserve
 1642 ?        00:00:00 rsyslogd
 1695 ?        00:00:01 dbus-daemon
 1706 ?        00:00:00 NetworkManager
 1709 ?        00:00:00 modem-manager
 1717 ?        00:00:00 wpa_supplicant
 1721 ?        00:00:00 avahi-daemon
 1732 ?        00:00:00 cupsd
 1757 ?        00:00:00 acpid
 1766 ?        00:00:00 hald
 1835 ?        00:00:00 sshd
 1873 ?        00:00:00 tpvmlp
 1945 ?        00:00:00 mysqld_safe
 2107 ?        00:00:00 abrtd
 2115 ?        00:00:00 abrt-dump-oops
 2123 ?        00:00:01 crond
 2134 ?        00:00:00 atd
 2149 ?        00:00:00 rhsmcertd
 2166 ?        00:00:00 gdm-binary
 2171 tty2     00:00:00 mingetty
 2175 tty3     00:00:00 mingetty
 2177 tty4     00:00:00 mingetty
 2179 tty5     00:00:00 mingetty
 2184 tty6     00:00:00 mingetty
 2217 ?        00:00:00 console-kit-dae
 2290 ?        00:00:00 dbus-launch
 2296 ?        00:00:00 devkit-power-da
 2338 ?        00:00:00 polkitd
 2349 ?        00:00:00 rtkit-daemon
 2367 ?        00:00:00 gnome-keyring-d
 2384 ?        00:00:00 dbus-launch
 2385 ?        00:00:00 dbus-daemon
 2399 ?        00:00:00 gconfd-2
 2403 ?        00:00:03 gnome-settings-
 2409 ?        00:00:00 seahorse-daemon
 2411 ?        00:00:00 gvfsd
 2420 ?        00:00:00 gvfs-fuse-daemo
 2439 ?        00:00:00 bonobo-activati
 2447 ?        00:00:00 trashapplet
 2448 ?        00:00:01 wnck-applet
 2450 ?        00:00:00 gvfs-gdu-volume
 2454 ?        00:00:00 udisks-daemon
 2456 ?        00:00:02 vmtoolsd
 2469 ?        00:00:00 pulseaudio
 2484 ?        00:00:00 gvfs-gphoto2-vo
 2487 ?        00:00:00 gvfs-afc-volume
 2502 ?        00:00:00 gdm-user-switch
 2503 ?        00:00:00 clock-applet
 2504 ?        00:00:00 notification-ar
 2505 ?        00:00:00 gnote
 2510 ?        00:00:00 gvfsd-trash
 2513 ?        00:00:00 restorecond
 2522 ?        00:00:00 gnome-screensav
 2536 ?        00:00:00 packagekitd
 2540 ?        00:00:01 notification-da
 2617 ?        00:00:00 gvfsd-burn
 2631 ?        00:00:00 gvfsd-metadata
 2652 ?        00:00:02 gedit
 2665 ?        00:00:03 gnome-terminal
[[email protected] Desktop]# 
时间: 2024-10-10 04:05:49

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

服务器cpu被大量僵尸进程占用

case info centos 6.5/RAID1+RAID5 服务器开机后大量进程占用cpu资源,居高不下,僵尸进程和负载越来越大,导致服务器各项服务不能正常使用 快速清理木马流程 假设木马的名字是nshbsjdy,如果top看不到,可以在/etc/init.d目录下面查看 1.首先锁定三个目录,不能让新木马文件产生 1 2 3 4 chmod 000 /usr/bin/nshbsjdy chattr +i /usr/bin chattr +i /bin chattr +i /tmp 2.删

服务器产生大量的僵尸进程

如何查看linux系统上的僵尸进程,如何统计有多少僵尸进程? #ps -ef | grep defunct 或者查找状态为Z的进程,Z就是代表zombie process,僵尸进程的意思. 另外使用top命令查看时有一栏为S,如果状态为Z说明它就是僵尸进程. Tasks:  95 total,   1 running,  94 sleeping,   0 stopped,   1617 zombie top命令中也统计了僵尸进程.或者使用下面的命令: ps -ef | grep defunct

TCP/IP 网络编程 (抄书笔记 3) -- 僵尸进程和多任务并发服务器

TCP/IP 网络编程 (抄书笔记 3) – 僵尸进程和多任务并发服务器 TCP/IP 网络编程 (抄书笔记 3) – 僵尸进程和多任务并发服务器 Table of Contents 僵尸进程的产生 避免僵尸进程 信号 多任务的并发服务器 僵尸进程的产生 子进程先退出, 父进程没有退出 ==> 僵尸进程 父进程先退出, 子进程没有退出 ==> 子进程被 0 号进程回收, 不会产生僵尸进程 pid_t pid = fork(); if (pid == 0) { // child printf(&

并发服务器三种实现方式之进程、线程和select

前言:刚开始学网络编程,都会先写一个客户端和服务端,不知道你们有没有试一下:再打开一下客户端,是连不上服务端的.还有一个问题不知道你们发现没:有时启服务器,会提示“Address already in use”,过一会就好了,想过为啥么?在这篇博客会解释这个问题. 但现实的服务器都会连很多客户端的,像阿里服务器等,所以这篇主要介绍如何实现并发服务器,主要通过三种方式:进程.线程和select函数来分别实现. 一.进程实现并发服务器 先说下什么是并发服务器吧?不是指有多个服务器同时运行,而是可以同

基于tomcat响应处理模型实现的高并发web服务器

在上一篇博客中,一个简单的AIOweb处理例子,可以看到AIO异步处理,依赖操作系统完成IO操作的Proactor处理模型确实很强大,可以是实现高并发,高响应服务器的不错选择,但是在tomcat中的connector的处理模型还依旧是基于NIO的处理,当然,我认为这可能会在以后的版本进行改进,但另一方面,我更认为AIO的负载控制方面的处理可能是比较难的,因为AIO api并没有提供我们对分配线程组的处理,而只是提供一个线程组,交给操作系统去解决io处理上的问题,所以,这可能会给需要复杂处理的负载

LINUX环境并发服务器的三种实现模型

服务器设计技术有很多,按使用的协议来分有TCP服务器和UDP服务器.按处理方式来分有循环服务器和并发服务器. 1  循环服务器与并发服务器模型 在网络程序里面,一般来说都是许多客户对应一个服务器,为了处理客户的请求,对服务端的程序就提出了特殊的要求. 目前最常用的服务器模型有: ·循环服务器:服务器在同一时刻只能响应一个客户端的请求 ·并发服务器:服务器在同一时刻可以响应多个客户端的请求 1.1 UDP循环服务器的实现方法: UDP循环服务器每次从套接字上读取一个客户端的请求->处理->然后将

Linux 网络编程——并发服务器的三种实现模型

服务器设计技术有很多,按使用的协议来分有 TCP 服务器和 UDP 服务器,按处理方式来分有循环服务器和并发服务器. 循环服务器与并发服务器模型 在网络程序里面,一般来说都是许多客户对应一个服务器(多对一),为了处理客户的请求,对服务端的程序就提出了特殊的要求. 目前最常用的服务器模型有: ·循环服务器:服务器在同一时刻只能响应一个客户端的请求 ·并发服务器:服务器在同一时刻可以响应多个客户端的请求 UDP 循环服务器的实现方法 UDP 循环服务器每次从套接字上读取一个客户端的请求 -> 处理

TCP并发服务器,每个客户一个子进程

在阅读完<unix 网络编程:卷一>之后,感觉作者真是unix下编程的大师级的人物.而对于我个人而言,每次阅读完一本技术书籍之后,一定还是得自己重新再写一遍程序(换点内容),复习书本中的内容(大致结构,或者说思想,相同),否则,你很难做到真的理解并掌握的地步. Okay,今天我带来的是服务器模型中的第一种,也是最基本最常用的一种模型–TCP并发服务器,每个客户一个子进程. 先简单介绍一下:TCP并发服务器,每个客户一个子进程,也就是说并发服务器调用fork派生一个子进程来处理每个子进程,使得服

第15章 高并发服务器编程(2)_I/O多路复用

3. I/O多路复用:select函数 3.1 I/O多路复用简介 (1)通信领域的时分多路复用 (2)I/O多路复用(I/O multiplexing) ①同一线程,通过"拨开关"方式,来同时处理多个I/O流,哪个IO准备就绪就把开关拨向它.(I/O多路复用类似于通信领域中的"时分复用") ②通过select/poll函数可以实现IO多路复用,他们采用轮询的方式来监视I/O.而epoll是对select/poll的加强,它是基于事件驱动,epoll_ctl注册事件