荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: everlove.bbs@bbs.shuoshuo.net (我是如此厌倦), 信区: Linux
标  题: unp第五章学习体会
发信站: 寂寞森林 (Mon Sep 23 10:38:58 2002)
转信站: SZUBBS!news2.happynet.org!news.happynet.org!LonelyWood


发信人: clown (梧桐叶), 信区: UNP
标  题: unp第五章学习体会
发信站: UNIX编程 (2001年08月19日18:47:49 星期天), 站内信件

本来觉得编写简单的socket应该没有什么问题了,看了本章之后真是感到汗颜。
1)CHLD信号处理
    在服务器端,对于已经连接的socket,一般都是派生出子进程来进行处理,
这样就要捕捉CHLD信号,否则可能会产生僵尸。一般signal(SIGCHLD, SIG_IGN)
就不会产生僵尸了,注意signal(SIGCHLD, SIG_DFL)会产生僵尸,该信号的SIG_DFL
处理是忽略。
    由于Unix信号是不排队的,也就是说,如果一个信号在阻塞是产生了多次,在
信号解阻塞以后,只会递交一次。书上有一个使用wait函数(应该使用waitpid)捕
捉处理CHLD的例子,可以清楚地说明该现象。
    另外,书上提到了一个基本规则:当一个进程阻塞于慢系统调用(slow system
call)时捕捉到一个信号,等到信号处理函数返回时,系统调用可能返回一个EINTR
错误(实际上并不是一个错误)。这样用户就需要对EINTR错误进行特殊的处理,那
就是按照apue上面介绍的,重新启动被中断的系统调用,这里就是重新调用accept
函数。可惜我在Linux 2.4核心中发现这条规则不成立,为了提高移植性,编程时
也许应该考虑考虑这条规则。
2)临界条件
    我以前很少注意到这些临界条件,:(,没想到socket中有这么多潜在的问题:
accept返回前连接夭折,服务器进程终止(可能是服务器父进程,也可能是负责某
个连接的子进程),服务器崩溃及重启。
    这些临界条件实际就是客户对于服务器的RST响应的处理。对于该问题,书上也
有一条规则:当一个进程向接收了RST的套接口进行写操作时,内核会给该进程发一
个SIGPIPE信号,该信号的缺省行为就是终止进程。我查了一下,SIGPIPE是指write
on a pipe with no one to read it。但是我测试时,kill掉负责连接的子进程以后,

再次写时并没有收到SIGPIPE信号。
3)数据格式
    也就是网络字节序和主机字节序的问题,跨套接口传送结构或者数据时,应该以
文本方式而不是二进制方式传送,相信大家都知道吧。
总之,套接字编程中有很多的细节问题,可能是我们以前没有注意到的。
--
※ 来源:·UNIX编程 www.tiaozhan.com/unixbbs/·[FROM: 202.114.1.61]

--
我站在夜的尽头
窗外的雨悄悄坠落





※ 来源:.寂寞森林 http://bbs.shuoshuo.net  ◆ FROM: 211.161.158.231


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店