TCP客户/服务器程序示例
TCP客户和服务器可以彼此通信之前,每一端都得指定连接的套接字对:本地IP地址,本地端口,外地IP地址,外地端口。
客户端角度:
客户端的外地IP地址和外地端口必须在客户调用connect时指定,而两个本地值通常就由内核作为connect的一部分来选定。客户也可在调用connect之前,通过调用bind来指定其中一个或两个本地值。
客户可以在连接建立后通过调用getsockname获取由内核指定的两个本地值。
服务器端角度:
本地端口由bind指定,bind调用中服务器指定的本地IP地址通常是通配IP地址。两个外地值则由accept调用返回给服务器。
POSIX 信号处理
信号:
1、由一个进程发送给另一个进程。
2、由内核发送给某个进程。
如SIGCHLD信号就是由内核在任何一个进程终止时,发送给该进程的父进程。
每个信号有一个与之关联的处置,或称为行为(action)(信号处理函数)。可以通过sigaction函数设置信号的行为。
1)设置信号处理函数
这种行为称为捕获信号。但是有两个信号不能被捕获:SIGKILL SIGSTOP 。 信号处理函数的原型为:
void handler(int signo);
2)将信号的处置设定为SIG_IGN来忽略该信号。SIGKILL SIGSTOP不能被忽略。
3)把某个信号的处置设定为SIG_DFL来启动它的默认处置。默认处置通常为:在收到信号后终止进程,其中某些喜好还在当前
工作目录产生一个进程的核心映像(core dump)
wait和waitpid:
当同时有5个进程同时终止时,使用wait但是SIGCHLD的处理函数只处理一次的话,还是会产生僵死进程!
所以正确的方法是设置waitpid非阻塞方式,循环调用,才能读取完所有SIGCHLD信号。
还没有评论,来说两句吧...