如何中断阻塞方式accept调用

鲫鱼跃龙门 2008-10-23 03:50:27
测试代码如下:
int sock = -1;

void *thlsn(void *param)
{
int newsock = 0;
struct sockaddr addr;
socklen_t len;

printf("start to accept\n");
newsock = accept(sock, &addr, &len);
printf("accept returned\n");
return NULL;
}

int main()
{
sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock < 0)
{
perror("socket");
}

struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(12345);
addr.sin_addr.s_addr = INADDR_ANY;

if (bind(sock, (struct sockaddr *)&addr, sizeof(addr)))
{
perror("bind");
}

if (listen(sock, 2))
{
perror("listen");
}

pthread_t th = 0;
if (pthread_create(&th, NULL, thlsn, NULL))
{
perror("pthread_create");
}

sleep(5);
close(sock);
sock = -1;
pthread_join(th, NULL);
return 0;
}
运行后立刻输出:start to accept
五秒过后,accept依然阻塞,谁知道要如何让其返回?
...全文
514 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
鲫鱼跃龙门 2008-10-24
  • 打赏
  • 举报
回复
TO: leeyiqun & xlanchen

二位的说法与我的实验结果一致。
经过我多方尝试,发现也只有用信号中断的方式才能实现了。

------------------------------
前面有位dayongxie朋友提到用pthread_cancel,
这个方法在本测试程序中是可以达到要求
只是pthread_cancel不会释放线程资源,还需要其他辅助函数来保证
释放线程资源,且是异步的。想想挺麻烦,故而一开始就放弃了

------------------------------
多谢大家的关注。
xlanchen 2008-10-23
  • 打赏
  • 举报
回复
TCP/IP在Linux中,accept使得进程进入TASK_INTERRUPTIBLE的睡眠状态。

从这上面看,应该可以使用信号唤醒

不妨试一下使用alarm看看
leeyiqun 2008-10-23
  • 打赏
  • 举报
回复
accpet函数当没有客户端连接的时候,它进入睡眠状态,它里面也没有设置多长时间如果没有客户端连接时就返回的,
如果想中断该函数的话,
只能中断调用accept函数的线程函数了。
发个中断信号给线程函数咯。
fallhunter 2008-10-23
  • 打赏
  • 举报
回复
同意楼上
dayongxie 2008-10-23
  • 打赏
  • 举报
回复
pthread_cancel 可以的
鲫鱼跃龙门 2008-10-23
  • 打赏
  • 举报
回复
补充:系统为FC8

23,120

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧