select()似乎是segfault / kill

时间:2012-07-23 14:34:17

标签: c select embedded segmentation-fault

我正在尝试调试使用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);

3 个答案:

答案 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/ 有关更详细的说明。