1

select()を使用して通信タイムアウトを実装する組み込みアプリケーションをデバッグしようとしています。これは、pthreadを使用してマルチスレッド化されています。

私が抱えている問題は、セグメンテーション違反または「Kill​​ed」のいずれかで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);
4

3 に答える 3

0

プログラムが実際にアイドル状態のselect場合、クラッシュが実際にプロセスモニターなどの外部エンティティによって引き起こされている場合は、特に珍しいことではありません。ソフトウェアウォッチドッグ、または悪名高いLinux Out of Memory Killer(OOM Killer)。システムログファイルをチェックして、外部関数が強制終了アクションをトリガーした兆候を見つけることができるかどうかを確認します。

于 2012-07-23T15:39:56.097 に答える
0

クラッシュの時間と場所がランダムであるため、マルチスレッドの問題が疑われました。すべてのマルチスレッドコードを削除しましたが、問題は解決したようです。

于 2012-07-24T13:45:17.617 に答える
0

selectには、1024までしかsockfdsをチェックできないという制限があります。1024はsockfdの最大値であり、sockfdの数ではないことに注意してください。代わりに、そのような制限がないポーリングを使用してください

詳細については、 http://www.moythreads.com/wordpress/2009/12/22/select-system-call-limitation/を参照 してください 。

于 2012-07-28T06:57:23.607 に答える