TCP/IP网络编程 - 多进程服务器端

一、并发服务器端实现模型:

  1、多进程服务器

  2、多路复用服务器

  3、多线程服务器

 

二、多进程服务器

  1、进程:占用内存空间的正在运行的程序;

  2、通过 fork 函数创建进程,根据返回值区分父子进程( 父进程:fork 返回子进程ID;子进程:fork 返回0 );

  3、僵尸进程:

    调用fork函数产生的子进程的终止方式:1) 调用 exit 函数; 2) main函数中执行 return 并返回值;

    向exit函数传递的参数值和main函数中return语句返回的值都会传递给操作系统,而操作系统不会销毁子进程,直到把这些值传递给产生该子进程的父进程;

    处在这种状态下的进程就是僵尸进程( 如果父进程终止,处于僵尸状态的子进程将同时销毁 );

  4、销毁僵尸进程:为了销毁子进程,父进程应主动请求获取子进程的返回值;

    1) 使用 wait 函数;2) 使用 waitpid 函数;

    调用 wait 函数时,如果没有已终止的子进程,那么程序将阻塞直到有子进程终止;

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/types.h>

/*
    pid_t wait(int * statloc); 
    使用宏处理返回值:
    WIFEXITED 子进程正常终止时返回"真"
    WEXITSTATUS 返回子进程的返回值

*/

int main(int argc,char *argv[]){

    int status;
    pid_t pid=fork();

    if(pid==0){
        return 3;
    }else{
        printf("Child PID: %d \n",pid);
        pid=fork();
        if(pid==0){
            exit(7);
        }else{
            printf("Child PID: %d \n",pid);
            wait(&status);
            if(WIFEXITED(status))
                printf("Child send one: %d \n",WEXITSTATUS(status));

            wait(&status);
            if(WIFEXITED(status))
                printf("Child send two: %d \n",WEXITSTATUS(status));

            sleep(30);  
        }
    }
}
View Code

  5、信号处理:"信号"是指特定事件发生时由操作系统向进程发送的消息;需要"注册信号"过程,即进程发现自己的子进程结束时操作系统调用特定函数;

   

    

 

  

 

posted @ 2015-12-16 23:57  chenyizh  阅读(181)  评论(0)    收藏  举报