1

我正在尝试调试使用 select() 来实现通信超时的嵌入式应用程序。它是使用 pthreads 的多线程。

我遇到的问题是应用程序似乎在 select() 调用上崩溃了,出现了分段错误或“Killed”。我尝试在呼叫周围放置一个互斥锁,但无济于事。

什么可能导致 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);
4

3 回答 3

0

由于崩溃的时间和地点的随机性,我怀疑是多线程问题。我删除了所有多线程代码,问题似乎已经停止。

于 2012-07-24T13:45:17.617 回答
0

如果您的程序实际上是空闲的,那么select如果崩溃实际上是由某个外部实体(如进程监视器)引起的,那么崩溃并不是特别罕见。软件看门狗,或臭名昭著的 Linux Out of Memory Killer (OOM Killer)。检查您的系统日志文件,看看您是否可以找到某些外部函数触发了终止操作的迹象。

于 2012-07-23T15:39:56.097 回答
0

select 有一个限制,它只能检查 sockfds 直到数字 1024。请注意,1024 是 sockfd 的最大值,而不是 sockfds 的数量。使用 poll 代替,它没有这样的限制

有关更详细的说明,请参阅 http://www.moythreads.com/wordpress/2009/12/22/select-system-call-limitation/ 。

于 2012-07-28T06:57:23.607 回答