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); } } }
5、信号处理:"信号"是指特定事件发生时由操作系统向进程发送的消息;需要"注册信号"过程,即进程发现自己的子进程结束时操作系统调用特定函数;
浙公网安备 33010602011771号