我文件服务器程序的僵尸进程已解散

时间:2015-10-25 03:50:03

标签: c++ c linux sockets fork

我有一个基于套接字的文件服务器程序,它使用$(document).ready(function(){ addNewLicns(); }); function addNewLicns () { var i = 1 SecId = i + 3 LicenseNumber = "nptLicenseNumber" Province = "nptProvince" LicenseCoun = "nptLicenseCoun" licenseExpMonth = "nptlicenseExpMonth" licenseExpDay = "nptlicenseExpDay" licenseExpYear = "nptlicenseExpYear" PhysicalExpMonth = "nptPhysicalExpMonth" PhysicalExpDay = "nptPhysicalExpDay" PhysicalExpYear = "nptPhysicalExpYear" CurrentLicense = "nptCurrentLicense" CommercialLicense = "nptCommercialLicense" CommercialClass = "nptCommercialClass" NoneEndorsements = "nptNoneEndorsements" TankerEndorsements = "nptTankerEndorsements" XEndorsements = "nptXEndorsements" DoublesEndorsements = "nptDoublesEndorsements" HazMatEndorsements = "nptHazMatEndorsements" OtherEndorsements = "nptOtherEndorsements" HaZmatExpMonth = "nptHaZmatExpMonth" ZmatExpDay = "nptZmatExpDay" ZmatExpDayExpYear = "nptZmatExpDayExpYear"; var htmlCont = '<div class="NewLicnsHolder"> <div class="panel panel-default"> <div class="panel-heading"> <h3 class="panel-title">License Information</h3><!-- /.panel-title --> </div><!-- /.panel-heading --> <div class="panel-body"> <div class="form-group"> <div class="col-md-4"> <label for="'; htmlCont += LicenseNumber+i+'" class="control-label required-npt">License Number</label> <input type="text" class="form-control" id="'; htmlCont += LicenseNumber+i+'" name="'+LicenseNumber+i+'" maxlength="150" data-parsley-group="block5" aria-describedby="licenesnum" placeholder="Ex: 1234567 or A123456" required /> <span id="licenesnum" class="help-block">License format should be 7 numeric or 1 alpha + 6 numeric</span> </div><!-- /.col-md-4 --> </div><!-- /.form-group --> <div class="form-group"> <div class="col-md-4"> <label for="'; htmlCont += Province+i+'" class="control-label required-npt">License State/Province</label> <select name="'; htmlCont += Province+i+'" id="'+Province+i+'" class="form-control" data-parsley-group="block5" required> <option value=""></option> <option value="AL">Alabama</option> <option value="AK">Alaska</option> <option value="AZ">Arizona</option> <option value="AR">Arkansas</option> <option value="CA">California</option> <option value="CO">Colorado</option> <option value="CT">Connecticut</option> <option value="DE">Delaware</option> <option value="DC">District Of Columbia</option> <option value="FL">Florida</option> <option value="GA">Georgia</option> <option value="HI">Hawaii</option> <option value="ID">Idaho</option> <option value="IL">Illinois</option> <option value="IN">Indiana</option> <option value="IA">Iowa</option> <option value="KS">Kansas</option> <option value="KY">Kentucky</option> <option value="LA">Louisiana</option> <option value="ME">Maine</option> <option value="MD">Maryland</option> <option value="MA">Massachusetts</option> <option value="MI">Michigan</option> <option value="MN">Minnesota</option> <option value="MS">Mississippi</option> <option value="MO">Missouri</option> <option value="MT">Montana</option> <option value="NE">Nebraska</option> <option value="NV">Nevada</option> <option value="NH">New Hampshire</option> <option value="NJ">New Jersey</option> <option value="NM">New Mexico</option> <option value="NY">New York</option> <option value="NC">North Carolina</option> <option value="ND">North Dakota</option> <option value="OH">Ohio</option> <option value="OK">Oklahoma</option> <option value="OR">Oregon</option> <option value="PA">Pennsylvania</option> <option value="RI">Rhode Island</option> <option value="SC">South Carolina</option> <option value="SD">South Dakota</option> <option value="TN">Tennessee</option> <option value="TX">Texas</option> <option value="UT">Utah</option> <option value="VT">Vermont</option> <option value="VA">Virginia</option> <option value="WA">Washington</option> <option value="WV">West Virginia</option> <option value="WI">Wisconsin</option> <option value="WY">Wyoming</option> <optgroup label="Provinces"> <option value="AB">Alberta</option> <option value="BC">British Columbia</option> <option value="MB">Manitoba</option> <option value="NB">New Brunswick</option> <option value="NL">Newfoundland and Labrador</option> <option value="NT">Northwest Territories</option> <option value="NS">Nova Scotia</option> <option value="NU">Nunavut</option ><option value="ON">Ontario</option> <option value="PE">Prince Edward Island</option> <option value="QC">Quebec</option> <option value="SK">Saskatchewan</option> <option value="YT">Yukon</option> </optgroup> </select> </div><!-- /.col-md-4 --> </div><!-- /.form-group --> <div class="form-group"> <div class="col-md-4"> <label for="'; htmlCont += LicenseCoun+i+'" class="control-label required-npt">What vehicle class are you driving?</label> <select name="'; htmlCont += LicenseCoun+i+'" id="'+LicenseCoun+i+'" class="form-control" data-parsley-group="block5" required> <option value="United States">United States</option> <option value="Canada">Canada</option> </select> </div><!-- /.col-md-4 --> </div><!-- /.form-group --> <div class="form-group"> <div class="input-group"> <div class="required-npt col-md-12">License Expiration</div><!-- /.required-npt --> <div class="pull-left"> <select name="'; htmlCont += licenseExpMonth+i+'" id="'+licenseExpMonth+i+'" class="form-control" data-parsley-group="block5" required> <option value="">MM</option> <option value="1">1</option> <option value="2">2</option> <option value="3">3</option> <option value="4">4</option> <option value="5">5</option> <option value="6">6</option> <option value="7">7</option> <option value="8">8</option> <option value="9">9</option> <option value="10">10</option> <option value="11">11</option> <option value="12">12</option> </select> </div><!-- /.pull-left --> <div class="pull-left"> <select name="'; htmlCont += licenseExpDay+i+'" id="'+licenseExpDay+i+'" class="form-control" data-parsley-group="block5" required> <option value="">DD</option> <option value="1">1</option> <option value="2">2</option> <option value="3">3</option> <option value="4">4</option> <option value="5">5</option> <option value="6">6</option> <option value="7">7</option> <option value="8">8</option> <option value="9">9</option> <option value="10">10</option> <option value="11">11</option> <option value="12">12</option> <option value="13">13</option> <option value="14">14</option> <option value="15">15</option> <option value="16">16</option> <option value="17">17</option> <option value="18">18</option> <option value="19">19</option> <option value="20">20</option> <option value="21">21</option> <option value="22">22</option> <option value="23">23</option> <option value="24">24</option> <option value="25">25</option> <option value="26">26</option> <option value="27">27</option> <option value="28">28</option> <option value="29">29</option> <option value="30">30</option> <option value="31">31</option> </select> </div><!-- /.pull-left --> <div class="pull-left"> <input type="text" class="form-control " id="'; htmlCont += licenseExpYear+i+'" name="'+licenseExpYear+i+'" maxlength="4" minlength="4" data-parsley-type="number" data-parsley-group="block5" placeholder="YYYY" required /> </div><!--/.pull-left --> </div><!-- /.input-group --> </div><!-- /.form-group --> <div class="form-group"> <div class="input-group"> <div class="required-npt col-md-12">Physical Expiration</div><!-- /.required-npt --> <div class="pull-left"> <select name="'; htmlCont += PhysicalExpMonth+i+'" id="'+PhysicalExpMonth+i+'" class="form-control" data-parsley-group="block5" required> <option value="">MM</option> <option value="1">1</option> <option value="2">2</option> <option value="3">3</option> <option value="4">4</option> <option value="5">5</option> <option value="6">6</option> <option value="7">7</option> <option value="8">8</option> <option value="9">9</option> <option value="10">10</option> <option value="11">11</option> <option value="12">12</option> </select> </div><!-- /.pull-left --> <div class="pull-left"> <select name="'; htmlCont += PhysicalExpDay+i+'" id="'+PhysicalExpDay+i+'" class="form-control" data-parsley-group="block5" required> <option value="">DD</option> <option value="1">1</option> <option value="2">2</option> <option value="3">3</option> <option value="4">4</option> <option value="5">5</option> <option value="6">6</option> <option value="7">7</option> <option value="8">8</option> <option value="9">9</option> <option value="10">10</option> <option value="11">11</option> <option value="12">12</option> <option value="13">13</option> <option value="14">14</option> <option value="15">15</option> <option value="16">16</option> <option value="17">17</option> <option value="18">18</option> <option value="19">19</option> <option value="20">20</option> <option value="21">21</option> <option value="22">22</option> <option value="23">23</option> <option value="24">24</option> <option value="25">25</option> <option value="26">26</option> <option value="27">27</option> <option value="28">28</option> <option value="29">29</option> <option value="30">30</option> <option value="31">31</option> </select> </div><!-- /.pull-left --> <div class="pull-left"> <input type="text" class="form-control " id="'; htmlCont += PhysicalExpYear+i+'" name="'+PhysicalExpYear+i+'" maxlength="4" minlength="4" data-parsley-type="number" data-parsley-group="block5" placeholder="YYYY" required /> </div><!--/.pull-left --> </div><!-- /.input-group --> </div><!-- /.form-group --> <div class="form-group"> <div class="col-md-12"> <label for="'; htmlCont += CurrentLicense+i+'" id="vldtion-label13" class="control-label required-npt">Is this your current driver license?</label> <span> <input type="radio" name="'; htmlCont += CurrentLicense+i+'" id="'+CurrentLicense+i+'" data-parsley-class-handler="#vldtion-label13" value="Yes" data-parsley-group="block5" required> Yes <input type="radio" name="'; htmlCont += CurrentLicense+i'" id="'+CurrentLicense+SecId+'" value="No"> No </span> </div><!-- /.col-md-12 --> </div><!-- /.form-group --> <div class="form-group"> <div class="col-md-12"> <label for="'; htmlCont += CommercialLicense+i+'" id="vldtion-label14" class="control-label required-npt">Is this a commercial driver license?</label> <span> <input type="radio" name="'; htmlCont += CommercialLicense+i+'" id="'+CommercialLicense+i+'-nptshow" class="radio-holder" data-parsley-class-handler="#vldtion-label14" value="Yes" data-parsley-group="block5" required> Yes <input type="radio" name="'; htmlCont += CommercialLicense+i+'" id="'+CommercialLicense+i+'-npthidden" class="radio-holder" value="No"> No </span> </div><!-- /.col-md-12 --> <div class="col-md-2'; htmlCont += CommercialLicense+' npthidden"> <label for="'+CommercialClass+i+'" class="control-label">License Class</label> <select required name="'; htmlCont += CommercialClass+i+'" id="'+CommercialClass+i+'" class="form-control" data-parsley-group="block5"> <option value=""></option> <option value="Class A">Class A</option> <option value="Class AZ">Class AZ</option> <option value="Class B">Class B</option> <option value="Class C">Class C</option> <option value="Class D">Class D</option> <option value="Class E">Class E</option> <option value="Class 1">Class 1</option> <option value="Class 2">Class 2</option> <option value="Class 3">Class 3</option> <option value="Class 4">Class 4</option> <option value="Class 5">Class 5</option> </select> </div><!-- /.col-md-2 nptCommercialLicense npthidden --> </div><!-- /.form-group --> <div class="form-group"> <div class="col-md-12"> <label for="'; htmlCont += NoneEndorsements+i+'" class="control-label">Endorsements</label> <span> <input type="checkbox" id="'; htmlCont += NoneEndorsements+i+'" name="'+NoneEndorsements+i+'" value="None">None <input type="checkbox" id="'; htmlCont += TankerEndorsements+i+'" name="'+TankerEndorsements+i+'" value="Tanker">Tanker <input type="checkbox" id="'; htmlCont += XEndorsements+i+'" name="'+XEndorsements+i+'" class="check-holder" value="X Endorsement">X Endorsement <input type="checkbox" id="'; htmlCont += DoublesEndorsements+i+'" name="'+DoublesEndorsements+i+'" value="Doubles / Triples">Doubles / Triples <input type="checkbox" id="'; htmlCont += HazMatEndorsements+i+'" name="'+HazMatEndorsements+i+'" class="ckeck-holder" value="Doubles / Triples">HazMat <input type="checkbox" id="'; htmlCont += OtherEndorsements+'" name="'+OtherEndorsements+'" value="Other">Other </span> </div><!-- /.col-md-12 --> <div class="nptHazMatEndorsements nptXEndorsements npthidden"> <div class="input-group"> <div class="required-npt col-md-12">Hazmat expiration date</div><!-- /.required-npt --> <div class="pull-left"> <select name="'; htmlCont += HaZmatExpMonth+i+'" id="'+HaZmatExpMonth+i+'" class="form-control" data-parsley-group="block5" required> <option value="">MM</option> <option value="1">1</option> <option value="2">2</option> <option value="3">3</option> <option value="4">4</option> <option value="5">5</option> <option value="6">6</option> <option value="7">7</option> <option value="8">8</option> <option value="9">9</option> <option value="10">10</option> <option value="11">11</option> <option value="12">12</option> </select> </div><!-- /.pull-left --> <div class="pull-left"> <select name="'; htmlCont += ZmatExpDay+i+'" id="'+ZmatExpDay+i+'" class="form-control" data-parsley-group="block5" required> <option value="">DD</option> <option value="1">1</option> <option value="2">2</option> <option value="3">3</option> <option value="4">4</option> <option value="5">5</option> <option value="6">6</option> <option value="7">7</option> <option value="8">8</option> <option value="9">9</option> <option value="10">10</option> <option value="11">11</option> <option value="12">12</option> <option value="13">13</option> <option value="14">14</option> <option value="15">15</option> <option value="16">16</option> <option value="17">17</option> <option value="18">18</option> <option value="19">19</option> <option value="20">20</option> <option value="21">21</option> <option value="22">22</option> <option value="23">23</option> <option value="24">24</option> <option value="25">25</option> <option value="26">26</option> <option value="27">27</option> <option value="28">28</option> <option value="29">29</option> <option value="30">30</option> <option value="31">31</option> </select> </div><!-- /.pull-left --> <div class="pull-left"> <input type="text" class="form-control " id="'; htmlCont += ZmatExpDayExpYear+i+'" name="'+ZmatExpDayExpYear+i+'" maxlength="4" minlength="4" data-parsley-type="number" data-parsley-group="block5" placeholder="YYYY" data-parsley-group="block5" required /> </div><!--/.pull-left --> </div><!-- /.input-group --> </div><!-- /.nptHazMatEndorsements nptXEndorsements npthidden --> </div><!-- /.form-group --> </div><!-- /.panel-body --> </div><!-- /.panel panel-default --> </div><!-- /.NewLicnsHolder -->' $('#addLicns').on('click', function() { if(i >= 10) { alert("You can't add More than 10."); } else { $(".licnsContainer").append(htmlCont); } i++; }); }一次为多个客户端提供服务。我执行fork后运行此服务器程序后,我收到了很多ps -ef个服务器的子进程。我该如何解决这个问题?下面是我的服务器代码。 提前谢谢。

<defunct>

1 个答案:

答案 0 :(得分:2)

成为僵尸进程:

当子进程完成其作业并终止时,父进程存在&amp;没有为它调用wait(),然后它变成了僵尸。

如何删除僵尸:

  • 让父进程在子进程上调用wait(),然后内核将正确清除已终止的进程,而不是让它成为僵尸。
  • 或者,终止父进程,然后init进程将成为其父进程,并将终止&amp;在终止时正确清理子进程。

在您的情况下:

因此,可能是您使用fork()创建了子进程而没有为其创建父进程wait(),并且父进程未终止。 因此,然后子进程完成它的工作,它变成了僵尸。

您可以尝试在子进程上使用wait()

发表评论中的问题

在何处添加wait()

  • 首先你需要根据你的逻辑决定使用哪个等待,有wait() / waitpid() / waitid(),其中wait()是最简单的一个控制最少的。如果可以在等待时阻止父进程,那么wait()就可以了,否则需要waitpid()waitid()。有关每项功能的详细信息,请参阅man页面。
  • 在决定使用哪个等待之后,通常在fork()之后添加等待函数,在main()结束之前,可能用一个循环来处理多个子进程,并检查wait的返回值来决定下一步。

图书 man页面相当不错,但是linux编程手册(例如TLPI)可能会提供很大的帮助。

代码示例

这是我在学习linux编程时编写的一个简单的测试程序,它创建了多个子进程&amp;等他们。

<强> wait_test.c

// wait() test
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/wait.h>

int wait_test() {
    pid_t cpid;
    int i, max_child = 5;

    // create child process,
    for(i=1; i<=max_child; i++) {
        switch(cpid=fork()) {
            case -1: // failed
                printf("error while fork()\n");
                exit(errno);
            case 0: // success, child process goes here
                sleep(i);
                printf("child [%d], going to exit\n",(int)getpid());
                _exit(EXIT_SUCCESS);
                break;
            default: // success, parent process goes here
                printf("parent [%d], child created [%d]\n", (int)getpid(), (int)cpid);
                break;
        }
    }

    // wait child to terminate
    int status;
    while(1) {
        if((cpid = wait(&status)) == -1) {
            if(errno == ECHILD) {
                printf("no more child\n");
                exit(EXIT_SUCCESS);
            } else {
                printf("error while wait()\n");
                exit(-1);
            }
        }
        printf("parent [%d], child [%d] exit with [%d]\n", (int)getpid(), (int)cpid, status);
    }

    return 0;
}

int main(int argc, char *argv[]) {
    wait_test();
    return 0;
}

在linux上编译: gcc -Wall wait_test.c

执行: ./a.out

它提供了儿童过程和基本视角的基本视图。等等可能有用。

@Update:SIGCHLD信号

正如@alk所评论的,使用SIGCHLD信号处理程序是另一种调用wait的方法,它可能更简单,但似乎有诀窍,并且容易出错。

以下是基于我有限使用SIGCHLD信号的知识的一些描述,只需将其作为提示,而不是确切的样本。

如何使用SIGCHID signal

默认情况下,进程会忽略SIGCHID信号,但可以在其上注册处理程序。

由于标准信号暂时被阻止&amp;没有排队,意味着可以发送多个信号&amp;这个过程可能只看到它发生一次, 因此,每当收到此信号时,应使用带waitpid()选项的WNOHANG循环来处理所有已终止的子进程。

处理程序函数可能如下所示:

void sigchld_handler() {
    int local_errno = errno; // backup errno,

    while (waitpid(-1, NULL, WNOHANG) > 0)
        continue;

    errno = local_errno; // restore errno,
}

在调用folk()之前,在父进程上注册处理程序:

if(signal(SIGCHLD, sigchld_handler) == SIG_ERR) {
    printf("error signal()");
    return errno;
}

然后,当子进程终止时,父进程将收到一个SIGCHLD信号,并调用处理函数,等待子进程,从而有助于清除子进程,而不是让它成为僵尸。 / p>