第十章 多进程服务器(下)

《TCP/IP网络编程》 尹圣雨 P165~P181

1信号处理

“子进程何时终止?调用waitpid函数后要无休止的等待吗?”

(1)向操作系统求助

子进程终止的识别主体是操作系统,若操作系统能把如下信息告诉正忙于工作的父进程,将有助于构建高效的程序。
引入信号处理Signal Handing机制,此处的信号是特定是在特定事件发生时由操作系统向进程发送的消息。为了响应该消息,执行与消息相关的自定义操作的过程称为“处理”或“信号处理”。

Java语言具有平台移植性,Java在编程语言支持进程或线程,但C、C++语言并不支持。ANSI标准并未定义支持进程或线程的函数(JAVA的方法)。进程或线程应由操作系统提供支持。Windows中按照Windows的方式,Linux中按照Linux的方式创建进程或线程。但 JAVA为保持平台移植性,以独立于操作系统的方式提供进程和线程的创建方法。因此,JAVA在语言层面支持进程和线程的创建。
JAVA在分布式环境中提供理想的网络编程模型。

(2)信号与Signal函数

信号注册函数

#include<signal.h>
void (*signal(int signo,void(*func)(int))) (int);
为了在产生信号时调用,返回之前注册的函数指针。
函数名 signal, 参数 :int signal, void(*func)(int) , 返回类型: 参数为int,返回void型函数指针

调用函数时,第一个参数为特殊情况信息,第二个参数为特殊情况下要调用的函数的地址值(指针)。发生第一个参数代表的情况时,调用第二个参数所指的函数。

在signal函数中注册的部分特殊情况和对应的常数

SIGALRM:已到通过调用alarm函数注册的时间
SIGINT:输入CRTL+C
SIGCHLD:子进程终止


子进程终止则调用mychildh函数
signal(SIGCHLD,mychild);

signal函数的调用语句
signal(SIGALRM,timeout);//已到通过调用alarm函数注册的时间,请调用timeout函数
signal(SIGINT,keycontrol);//输入CRTL+C调用keycontrol函数


注册信号后,发生注册信号时,操作系统将调用该信号对应的函数。
#include<unistd.h>
unsigned int alarm(unsigned int seconds);
返回0或以秒为单位的距SIGALRM信号发生所剩时间

如果调用该函数的同时向它传递一个正整形参数,相应时间后将产生SIGALRM信号。若向该函数传递0,则之前对SIGALRM信号的预约将取消。如果通过该函数预约信号后未指定该信号对应的处理函数,则通过调用signal函数终止进程。

发生信号时将唤醒由于调用sleep函数而进入阻塞状态的进程。

调用函数的主体是操作系统,但进程处于睡眠状态时无法调用函数。因此,产生信号时,为调用信号处理器,将唤醒由于调用sleep函数而进入阻塞状态的继承你。而且一旦被唤醒,就不会再进入睡眠状态。即使还未到sleep函数中规定的时间也是如此。


(3)利用sigaction函数进行信号处理

类似于signal函数,完全可以取代后者,也更稳定。 原因:signal函数在UNIX系列的不同操作系统中可能存在区别,但sigaction函数完全相同
#include<signal.h>
int sigaction (int signo,const struct sigaction *act,struct sigaction * oldact);
成功时返回0,失败时返回-1
signo:与signal函数相同,传递信号信息
act:对应于第一个参数的信号处理函数信息
oldact:通过此函数获取之前注册的信号处理函数指针,若不需要则传递0


声明并初始化sigaction结构体变量以调研上述函数
struct sigaction{
	void (* sa_handler) (int);//sa_handler成员保存信号处理函数的指针值(地址值)
	sigset_t sa_mask;
	int sa_flags;
};


利用信号处理技术消灭僵尸进程。P171~P173.


2 基于多任务的并发服务器


基于进程的并发服务器模型

回声服务器端每次只能向1个客户端提供服务,因此,我们将拓展回声服务器端,使其可以同时向多个客户端提供服务。
与之前的回声服务器端的区别:
1)第一阶段:回声服务器端父进程提供调用accept函数受理连接请求
2)第二阶段:此时获取的套接字文件描述符创建并传递给子进程
3)第三阶段:子进程利用传递来的文件描述符提供服务


通过fork函数复制文件描述符
套接字属于操作系统-只是进程拥有代表相应套接字的文件描述符。

复制套接字后,同一端口将对应多个套接字、

调用fork函数后,要将无关的套接字文件描述符关闭。


3 分割TCP的I/O程序

客户端的父进程负责接收数据,额外创建的子进程负责发送数据。分割后,不同进程分别负责输入和输出,这样无论客户端是否从服务器端接收完数据都可以进行传输。

优点:程序的实现更加简单。
   提高频繁交换数据的程序性能。


回声客户端不用分割I/O程序、
























  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值