我正在尝试调试使用select()实现通信超时的嵌入式应用程序。它是使用pthreads多线程的。
我遇到的问题是应用程序似乎在使用分段错误或“已杀死”的select()调用时崩溃。我尝试在呼叫周围加一个互斥锁无济于事。
什么可能导致select()崩溃应用程序?或者我是完全错误的方向?
对select()的调用如下所示:
fd_set rfds;
struct timeval tv;
int retval, timeout, timeout_usec = 0;
FD_ZERO(&rfds);
FD_SET(fd_port, &rfds);
if (use_timeout) {
timeout = settings_get_int("rs485_timeout", "3");
} else {
timeout = 0;
timeout_usec = 100000;
}
// timeout wait for reply 1000ms
tv.tv_sec = timeout;
tv.tv_usec = timeout_usec; //1000000;
retval = select((int)fd_port+1, &rfds, NULL, NULL, &tv);
答案 0 :(得分:0)
如果您的程序实际上处于空闲状态,那么如果崩溃实际上是由某个外部实体(如进程监视器)引起的,则select
中的崩溃并不特别异常。软件看门狗,或臭名昭着的Linux Out of Memory Killer(OOM Killer)。检查系统日志文件,看看是否可以找到某些外部函数触发kill操作的指示。
答案 1 :(得分:0)
由于崩溃时间和地点的随机性,我怀疑多线程问题。我删除了所有多线程代码,问题似乎已经停止。
答案 2 :(得分:0)
select有限制,它只能检查sockfds到1024的数量。 请注意,1024是sockfd的最大值,而不是sockfds的数量。 使用民意调查,没有这样的限制
请参考 http://www.moythreads.com/wordpress/2009/12/22/select-system-call-limitation/ 有关更详细的说明。