select() 似乎出现段错误/杀死

问题描述 投票:0回答:3

我正在尝试调试一个使用 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);
c segmentation-fault embedded posix-select
3个回答
0
投票

如果您的程序实际上处于空闲状态,那么如果崩溃实际上是由某些外部实体(例如进程监视器)引起的,则崩溃在

select
中并不是特别不寻常。软件看门狗,或臭名昭著的 Linux 内存不足杀手(OOM Killer)。检查您的系统日志文件,看看是否可以找到某些外部函数触发了终止操作的指示。


0
投票

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


0
投票

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

请参考 http://www.moythreads.com/wordpress/2009/12/22/select-system-call-limitation/ 以获得更详细的描述。

© www.soinside.com 2019 - 2024. All rights reserved.