📄 80.htm
字号:
※ 来源:·UNIX编程 www.tiaozhan.com/unixbbs/·[FROM: 211.69.205.23] <br>
发信人: scz (小四), 信区: UNP <br>
标 题: Re: unp第十三章学习体会 <br>
发信站: UNIX编程 (2001年09月21日11:45:43 星期五), 站内信件 <br>
<br>
鬼知道你怎么看的书 <br>
<br>
<br>
发信人: hellguard (小四), 信区: Unix <br>
标 题: Re: 如何定时中断tcp连接的connect()函数 <br>
发信站: BBS 水木清华站 (Wed Sep 19 18:07:59 2001) <br>
<br>
问题很经典,呵,UNP的26.6节 <br>
<br>
2. ... ... <br>
<br>
注意到前面处理超时中使用了alarm信号,假设你对Unix网络编程已经有 <br>
基础,那么是否注意到signal安装alarm信号句柄的时候没有考虑 <br>
SA_RESTART和SA_INTERRUPT两种情况。于是你认为那些为超时所设计的 <br>
代码无效正是因为这个原因,那好,我们把Stevens的函数换上来,如何呢, <br>
处理超时依旧没有成功。在NsFocus的Unix技术论坛上一个叫小许的朋友 <br>
提供的代码同样存在这个问题,这里一并指出。 <br>
<br>
呵,问题在于,系统调用会对SA_RESTART和SA_INTERRUPT的设置作出相应 <br>
动作而不重 艟身(被alarm信号打断的),可那些库函数没有这么统一。 <br>
许多库函数实现对于EINTR错误返回值的处理动作就是重启相应的系统调用, <br>
所以,前面版本中的alarm设置是没有预期效果的,相反会进一步消耗时间。 <br>
因为有这种可能,比如connect了15秒,结果被alarm信号打断,然后重新 <br>
connect,直到connect本身的超时时限到了,于是多消耗了15秒。 <br>
<br>
作为一般编程爱好者来说,对于系统调用和库函数的区别可能不那么要紧。 <br>
对于进行网络程序开发的Unix程序员,必须仔细区分每一个术语背后的技术 <br>
细节,比如上面提降 信号中断后的重启 <br>
<br>
本程序处理上面提到的几个问题,并且允许从命令行上指定超时时限,针对 <br>
不同的网络负载可以调整这个超时时限,既不要无谓消耗时间减缓扫描速度, <br>
也不要一味追求扫描速度而漏报重要信息。 <br>
<br>
<br>
3. 为了解决上面alarm信号无法设置超时时限的问题,我们使用sigsetjmp和 <br>
siglongjmp函数。在W.Richard.Stevens的APUE里介绍了这两个函数,在作 <br>
者的另外一部书UNP的26.6节给出了一个实际例子,我们这里的代码取自后者。 <br>
<br>
<br>
【 在 canye (canye) 的大作中提到: 】 <br>
: 在程序中建立tcp连接,调用connect()函数,想 <br>
: 自己定时中断它,程序如下: <br>
: signal(SIGALRM,timeoutfail); <br>
: alarm(timeout); <br>
: int result=connect(。。。。); <br>
: alarm(0); <br>
: 中断处理函数timeoutfail()中只是显示一些字符后return <br>
: 但是现在timeout到了以后,调用了timeoutfail(),connect() <br>
: 却仍然阻塞,并没有退出。 <br>
: 应该如何做才能让connect()退出呢?因为我需要自己控制tcp的 <br>
: 超时时间???请高手指教。 <br>
: ................... <br>
<br>
【 在 clown (梧桐叶) 的大作中提到: 】 <br>
: 本章主要介绍了socket编程中的几个I/O函数及其控制。主要包括 <br>
: 设置超时时间,recv和send函数的flag参数的设置,套接口I/O和 <br>
: 标准I/O的互用,T/TCP(事务TCP),关于recvmsg和sendmsg函数, <br>
: 第十四章Unix域协议介绍了其使用,等我测试完了再讨论这两个函数。 <br>
: 1)套接口超时 <br>
: 主要有三种方法:调用alarm函数,使用SIGALRM信号;select阻塞; <br>
: SO_RCVTIMEO和SO_SNDTIMEO两个套接口选项(Linux支持这两个选项)。 <br>
: 可惜的是后两种方法都是只能对读写操作设置超时,而使用alarm产生 <br>
: SIGALRM信号在Linux中不会中断慢速系统调用(这里是connect函数), <br>
: 因此在Linux中估计不能使用第一种方法设置超时,那么Linux中如何对 <br>
: .................(以下省略) <br>
<br>
-- <br>
<br>
也许有一天,他再从海上蓬蓬的雨点中升起, <br>
飞向西来,再形成一道江流,再冲倒两旁的石壁, <br>
再来寻夹岸的桃花。然而,我不敢说来生,也不敢信来生...... <br>
※ 来源:·UNIX编程 www.tiaozhan.com/unixbbs/·[FROM: 211.167.65.123] 发信人: ysq <br>
cn (岁月无声), 信区: UNP <br>
标 题: Re: unp第十三章学习体会 <br>
发信站: UNIX编程 (2001年09月21日13:47:00 星期五), 站内信件 <br>
<br>
也就是有些系统调用,即使对信号处理设置了 <br>
SA_INTERRUPT标志,它仍然会重启动? <br>
【 在 scz (小四) 的大作中提到: 】 <br>
: 鬼知道你怎么看的书 <br>
: 发信人: hellguard (小四), 信区: Unix <br>
: 标 题: Re: 如何定时中断tcp连接的connect()函数 <br>
: 发信站: BBS 水木清华站 (Wed Sep 19 18:07:59 2001) <br>
: 问题很经典,呵,UNP的26.6节 <br>
: 2. ... ... <br>
: 注意到前面处理超时中使用了alarm信号,假设你对Unix网络编程已经有 <br>
: 基础,那么是否注意到signal安装alarm信号句柄的时候没有考虑 <br>
: SA_RESTART和SA_INTERRUPT两种情况。于是你认为那些为超时所设计的 <br>
: 代码无效正是因为这个原因,那好,我们把Stevens的函数换上来,如何呢, <br>
: .................(以下省略) <br>
-- <br>
※ 来源:·UNIX编程 www.tiaozhan.com/unixbbs/·[FROM: 211.69.197.81] 发信人: clow <br>
n (梧桐叶), 信区: UNP <br>
标 题: Re: unp第十三章学习体会 <br>
发信站: UNIX编程 (2001年09月21日15:16:02 星期五), 站内信件 <br>
<br>
我测试过了,Linux中设置了SA_INTERRUPT标志以后,就不会重启了.觉得 <br>
其它系统也应该不会重启了吧. <br>
<br>
我的基础还是不行, :), 以前看apue的时候,信号处理这一章就有很多 <br>
地方不太明白,后来来回看了几次,还是没有完全明白. <br>
【 在 ysqcn (岁月无声) 的大作中提到: 】 <br>
: 也就是有些系统调用,即使对信号处理设置了 <br>
: SA_INTERRUPT标志,它仍然会重启动? <br>
: 【 在 scz (小四) 的大作中提到: 】 <br>
: : 鬼知道你怎么看的书 <br>
: : 发信人: hellguard (小四), 信区: Unix <br>
: : 标 题: Re: 如何定时中断tcp连接的connect()函数 <br>
: : 发信站: BBS 水木清华站 (Wed Sep 19 18:07:59 2001) <br>
: : 问题很经典,呵,UNP的26.6节 <br>
: : 2. ... ... <br>
: : 注意到前面处理超时中使用了alarm信号,假设你对Unix网络编程已经有 <br>
: .................(以下省略) <br>
<br>
-- <br>
易朽的是生命,似那转瞬即谢的花朵;然而永存的,是对未来的渴望, <br>
是那生生世世传递下来的,不朽的,生的激情。每一朵勇敢开放的花, <br>
都是一个死亡唇边的微笑。 <br>
※ 来源:·UNIX编程 www.tiaozhan.com/unixbbs/·[FROM: 202.114.1.61] 发信人: scz ( <br>
小四), 信区: UNP <br>
标 题: Re: unp第十三章学习体会 <br>
发信站: UNIX编程 (2001年09月21日17:42:07 星期五), 站内信件 <br>
<br>
faint <br>
刚说他不好好看书,你又来了。这回干脆是不好好看文章了。 <br>
<br>
lib function和syscall不同,应用层编程中有些connect是syscall <br>
有些是lib function。而lib function是否重启syscall是实现相关 <br>
的 <br>
<br>
【 在 ysqcn (岁月无声) 的大作中提到: 】 <br>
: 也就是有些系统调用,即使对信号处理设置了 <br>
: SA_INTERRUPT标志,它仍然会重启动? <br>
: 【 在 scz (小四) 的大作中提到: 】 <br>
: : 鬼知道你怎么看的书 <br>
: : 发信人: hellguard (小四), 信区: Unix <br>
: : 标 题: Re: 如何定时中断tcp连接的connect()函数 <br>
: : 发信站: BBS 水木清华站 (Wed Sep 19 18:07:59 2001) <br>
: : 问题很经典,呵,UNP的26.6节 <br>
: : 2. ... ... <br>
: : 注意到前面处理超时中使用了alarm信号,假设你对Unix网络编程已经有 <br>
: .................(以下省略) <br>
<br>
-- <br>
<br>
也许有一天,他再从海上蓬蓬的雨点中升起, <br>
飞向西来,再形成一道江流,再冲倒两旁的石壁, <br>
再来寻夹岸的桃花。然而,我不敢说来生,也不敢信来生...... <br>
※ 来源:·UNIX编程 www.tiaozhan.com/unixbbs/·[FROM: 211.167.65.123] 发信人: ysq <br>
cn (岁月无声), 信区: UNP <br>
标 题: Re: unp第十三章学习体会 <br>
发信站: UNIX编程 (2001年09月22日13:12:10 星期六), 站内信件 <br>
<br>
xixi,我本来就是这样,从来看书就不认真,也是基础知识不扎实啊, <br>
想起了墙上芦苇那句诗,呵呵 <br>
【 在 scz (小四) 的大作中提到: 】 <br>
: faint <br>
: 刚说他不好好看书,你又来了。这回干脆是不好好看文章了。 <br>
: lib function和syscall不同,应用层编程中有些connect是syscall <br>
: 有些是lib function。而lib function是否重启syscall是实现相关 <br>
: 的 <br>
: 【 在 ysqcn (岁月无声) 的大作中提到: 】 <br>
: : 也就是有些系统调用,即使对信号处理设置了 <br>
: : SA_INTERRUPT标志,它仍然会重启动? <br>
: : .................(以下省略) <br>
-- <br>
※ 修改:·ysqcn 於 09月22日13:15:54 修改本文·[FROM: 211.69.197.81] <br>
※ 来源:·UNIX编程 www.tiaozhan.com/unixbbs/·[FROM: 211.69.197.81] <br>
</small><hr>
<p align="center">[<a href="index.htm">回到开始</a>][<a href="54.htm">上一层</a>][<a href="81.htm">下一篇</a>]
<p align="center"><a href="http://cterm.163.net">欢迎访问Cterm主页</a></p>
</table>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -