Chinaunix首页 | 论坛 | 博客
  • 博客访问: 58317
  • 博文数量: 10
  • 博客积分: 520
  • 博客等级: 中士
  • 技术积分: 232
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-11 17:00
文章分类

全部博文(10)

文章存档

2010年(1)

2009年(5)

2008年(4)

我的朋友

分类: C/C++

2010-03-11 21:33:46

写过socket的朋友们一定都有过这样的经历:程序想退出的时候,却发现被accept阻塞着,此时,想退出程序只能强行杀死。多进程多线程的时候这个问题尤其严重,曾经在网上查了很多资料,也没有人给个好的解决方法,只有用select实行非阻塞模式,直到今天,这个问题终于找到了一个完美的解决方案(非select,socket阻塞模式时,linux下编程已测)。 简单说说我的实现方式吧:信号+longjmp。 伪代码如下:

int main()
{
    socket s;
    ...
    bind(s);
    ...
    socket ns = accept();//此处就是让我们头疼的地方了。 ...

}

只需要在代码上稍作修改,就可以实现退出阻塞模式的accept了。想退出此程序时,只需要向该程序发送一个SIGIO的信号即可了^_^。

static jmp_buf jmpbuf;
static void sig_quit(int signo)
{
    longjmp(jmpbuf, 1);
}
int main()
{
    socket s;
    singal(SIGIO, sig_quit);
    ...
    bind(s);
    ...
    if(setjmp(jmpbuf)) {
        exit(0);
    }
    socket ns = accept();//即使堵在此也不怕了

    ...
}

简单说下原理吧,这个是使用了SIGIO可打断阻塞程序的原理,跳出accept阻塞,又利用了longjmp可以跳出函数的原理,彻底摆脱accept的束缚,很简单,不知道当初为啥一直没想到,受了accept多年的折磨。windows下应该也会有相应的消息+跳转机制与之对应,我不太熟,就不给举例子了。感兴趣的可以试试我这个方法,我目前只在linux下试过,不知道unix和其他类unix系统是否好用,仅希望此文能能抛砖引玉,让大家有更好更方便的方案发出来给大家分享一下。
阅读(1352) | 评论(2) | 转发(0) |
0

上一篇:split分割函数

下一篇:没有了

给主人留下些什么吧!~~

chinaunix网友2010-07-26 11:35:58

不谈其它,这些JMP调用还是很有用的,特别是当一些不可避免的阻塞发生时,带信号屏蔽字的JMP调用功能更强

chinaunix网友2010-06-02 01:25:31

这方法太笨了,也不漂亮。编软件除了功能达到,还得解决得漂亮。方法太多了,多从网上找找吧