一个关于POLL的BUG,百思不得其解

#背景
系统:ubuntu 16.04 server 64bit
该问题出现在HTTP流媒体服务器中,流媒体服务器一直监听服务SOCKECT,当有新的连接时,则读取请求内容,并根据请求内容作出相应回复。
问题是当客户端FD为1087,客户端连接数到达1044时服务器会异常退出,百思不得其解。
#出错打印
出错打印使用GDB调试,也不能追踪到具体行数,看起来信息也是很奇怪

*** stack smashing detected ***: /usr/local/bin/mscore terminated

Thread 6 "dohrserver" received signal SIGABRT, Aborted.
[Switching to Thread 0x7ffff1ac6700 (LWP 7772)]
0x00007ffff3c55428 in __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:54
54	../sysdeps/unix/sysv/linux/raise.c: No such file or directory.

#出错地方
经过多次调试终于定位到问题出现在poll函数接口,但原理一直没想明白!!!

int ff_network_wait_fd_timeout(int fd, int write,int retrytime)
{
	int ev = write ? POLLOUT : POLLIN;
	struct pollfd p = { .fd = fd, .events = ev, .revents = 0 };
	int ret=0;
	do{
		ret = poll(&p, 1, 100);/*100ms*/
		if(ret!=0)
			break;/*fd ready or errors*/
	}while(retrytime-->0);

	if(!(retrytime>0)){
		ret=-1;
	}
	return ret ;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
下面是一个简单的驱动程序示例,它实现了poll函数: ```c #include <linux/init.h> #include <linux/module.h> #include <linux/fs.h> #include <linux/poll.h> MODULE_LICENSE("GPL"); #define DEVICE_NAME "mypoll" static int my_poll(struct file *filp, poll_table *wait) { int mask = 0; poll_wait(filp, wait, &wait_queue); if (data_available()) { mask |= POLLIN | POLLRDNORM; } return mask; } static struct file_operations fops = { .owner = THIS_MODULE, .poll = my_poll, }; static int __init mypoll_init(void) { int ret; ret = register_chrdev(0, DEVICE_NAME, &fops); if (ret < 0) { printk(KERN_ALERT "Failed to register device: %s\n", DEVICE_NAME); return ret; } printk(KERN_INFO "Device registered: %s\n", DEVICE_NAME); return 0; } static void __exit mypoll_exit(void) { unregister_chrdev(0, DEVICE_NAME); printk(KERN_INFO "Device unregistered: %s\n", DEVICE_NAME); } module_init(mypoll_init); module_exit(mypoll_exit); ``` 在这个示例中,我们实现了一个名为my_poll的函数,它接受两个参数:一个指向文件结构体的指针filp和一个指向poll_table的指针wait。poll_table是一个用于等待事件的数据结构,它包含一个或多个等待队列。 在my_poll函数中,我们使用了poll_wait宏将当前进程加入等待队列中。如果数据可用,则设置mask变量中的POLLIN和POLLRDNORM标志,并返回mask值。 在初始化函数中,我们使用register_chrdev函数注册设备,并将my_poll函数指定为poll操作的回调函数。 在卸载函数中,我们使用unregister_chrdev函数注销设备。 注意:这个示例中的data_available函数没有被定义。它应该是一个用于检查数据是否可用的函数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

酷咪哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值