4

シリアルポートから常に読み取るループがあります。ループは無限なので、プログラムを停止する唯一の方法は を使用することCtrl+Cです。このソリューションの問題は、他の問題も引き起こしていると思われますが、 を使用するCtrl+Cと、プログラムが突然終了することです。Ctrl+Cプログラムの最後に、アクセスしているシリアルポートのファイル記述子への接続を閉じますが、コマンドを使用しているため、プログラムがその場所に正確に停止するだけで、プログラムがそれに到達することはないと思います.

無限 while ループを作成し、必要なときに終了すると同時に、その下のコードを実行する機能を維持する方法はありますか?

4

5 に答える 5

12

これを試して、何が起こるか見てみましょう:

#include <unistd.h>
#include <stdio.h>
#include <signal.h>

volatile sig_atomic_t stop;

void
inthand(int signum)
{
    stop = 1;
}

int
main(int argc, char **argv)
{
    signal(SIGINT, inthand);

    while (!stop)
        pause();
    printf("exiting safely\n");

    return 0;
}

Ctrl-C は、シグナル (SIGINT) をプロセスに送信します。プロセスのデフォルトのアクションは、プロセスが取得したときに終了することですが、代わりにシグナルをキャッチして適切に処理することができます。

于 2012-10-22T11:38:04.457 に答える
7

次のようなことができます。

sig_atomic_t volatile g_running = TRUE;

void sig_handler(int signum)
{
  if (signum == SIGINT)
    g_running = FALSE;
}

int main()
{
  signal(SIGINT, &sig_handler);
  while (g_running)
  {
    //your code
  }
  //cleanup code
}

これにより、CTRL-C を押すことによって生成されたシグナルがキャッチされ、 に設定することSIGINTによってループが中断されます。その後、クリーンアップ コードが実行されますg_runningFALSE

于 2012-10-22T11:37:00.917 に答える
0

whileループを制御する変数を使用します。例:while(running)。ループを終了するには、この変数を非同期的にfalseに設定するだけです。

例:

volatile int running = 1;
while(running) {
    /* Your code */
}

したがって、別のコード、たとえばコールバック関数はこれを行います

running = 0;

このコールバックを設定して、SIG_TERM(デフォルトではCtrl-C)または任意のシグナル(プロセスに送信されないSIG_KILLを除く)をインターセプトできます。

于 2012-10-22T11:34:08.770 に答える
0

無限のwhileループの代わりに、特定のファイルのブール値をリッスン/読み取るwhileループを作成します。ファイルを編集してループを終了できます。

于 2012-10-22T11:34:23.153 に答える
0

ctrl + Cを使用すると、実際にプログラムが中断されます。それを避けるために

1)変数を使用し、ループのすべての反復でその状態を確認します。

int  shouldExit  = 0;

----
----
---
while (your_condition){
  if(shouldExit == 1) {
     break;
  }

  // Your loop logic here
}

次に、変数を非同期に設定します

shouldExit = 1 

終了したいとき。

于 2012-10-22T11:34:26.830 に答える