0

LynxOS プログラムを ubuntu ディストリビューションと gcc 4.1.3 に移行しています。

ほぼ完了しましたが、問題があります。プログラムを強制的に終了させる SIGALRM シグナルを受信して​​います。alarm(x) を呼び出していないのに、なぜこの信号を受信して​​いるのかわかりません。

これを sigaction で回避しましたが、プログラムが正しく動作していません mq_receive は、この SIGALRM を受信するたびに失敗します。

このコード変換が原因ではないかと思います。

#include <events.h>
#include <timers.h>

evtset_t EvtMask;
struct timespec Time;

Time.tv_sec = 2;
Time.tv_nsec = 0;
evtsuspend (&EvtMask, &Time);

今だろう

sleep(2);

これは、LynxOS によって提供される evtsuspend に関する情報です。

evtsuspend (評判が悪いので画像を挿入できません)

それらは同じように機能すると思いますか?(イベントマスクを指定せずに) sleep() は、SIGALRM が継続するのも待ちます。

感謝と敬意

4

2 に答える 2

3

1) プログラムで strace を実行して、詳細を確認できるかどうかを確認してください。

あなたのプログラムについてもっと詳しく教えていただけるとうれしいです...しかし、これが役立つかもしれません。

たぶんmq_receive()タイムアウトです。SIGALRM は、タイムアウトしたシステムコールをアプリケーションに通知するために使用されていると思います。

または、コードで SIGALRM を引き起こしている別のものを使用している可能性がありますsetitimer()

Linuxでsleep(2)を使用することについての質問について。sleep(2) 呼び出し中にプログラムをブロックしたい場合は、はい、それを使用しても問題ありません。ブロックしたくない場合は、インターバルタイマーを開始してそれsetitimer()を使用します。注: setitimer() は、タイマーが起動するときに SIGALRM を使用します... 詳細については、マンページを参照してください。

于 2009-12-31T19:32:35.530 に答える
0

これは古いトピックだmq_receive()と思いますが、質問の一部に対する回答は次のとおりです。

mq_receive()信号を受信するとブロックが解除されます。これが発生すると、リターン コードが に設定され-1、errno が に設定されEINTRます。への呼び出しの周りにコードをラップしmq_receive()てこれを確認し、必要に応じて呼び出すことができます。

于 2013-03-28T05:08:45.627 に答える