4

私は主に Windows 環境の出身なので、Linux で何かを書くことに移行するのに少し迷っています。

次のような単純な C/C++ アプリケーションがあるとします。

int main(int argc, char** argv)
{
    int h = open("something");

    while (true)
    {
        // do work
        usleep(10000);
    }

    close(h);
}

WindowsではGetAsyncKeyState()、エスケープキーなどを探すために(または他の種類のキーボードチェック機能)のようなものを使用し、それが押されたときにループから抜け出します。そうclose(h)すれば、私が呼び出され、必要なすべてのクリーンアップを行うことができます。

私が Linux でアプリケーションを終了する方法は、CTRL+を使用していましCた。これは、私の読書によると、それSIGINTが送信することを意味し、アプリケーションを終了させるための「フレンドリーな」方法です。ただし、私の経験では、それは単にすべてをドロップし、その信号を受け取ったときにどこにでも閉じてしまうだけです (つまり、ループ後のクリーンアップが実行されないことを意味します)。

signal()をリッスンするために使用することを提案する人もいればSIGINT、その方法に同意しない人もいます。(さらに、Windows と Linux の間での処理方法に多少の違いが生じる傾向があるため、両方のプラットフォームでの実行に可能な限り近づけたいと考えています。)

このようなことに対する「ベストプラクティス」はありますか?

4

3 に答える 3

3

ハンドラーを使用することSIGINTは、実際には POSIX の世界でこれらを処理する通常の方法であり、Windows での使用に似てSetConsoleCtrlHandlerいます。

シグナル ハンドラーでSIGINTフラグを設定すると、ループはこのフラグを終了する必要があるかどうかをチェックします。

ただし、クリーンアップに特別な必要がない限り、厳密には必要ありません (たとえば、他のアプリケーションにさようならメッセージを送信するなど)。OS は、すべてのファイルが適切に閉じられていること、すべてのメモリ割り当てが解放されていることなどを確認します。Windows とまったく同じです。

于 2013-04-01T14:32:14.157 に答える
1

通常、 getch(); を実行するとき。キーが押されるまで、プログラムの入力はブロックされます。これは UNIX の世界では「正規」処理と呼ばれます (canons=rules)。オフにすることができます。したがって、 getch(); を実行すると キーが押されていない場合は、すぐに -1 またはその他の種類のエラー コードが返されます。

私にとっては15年経っているので詳細はわかりませんが、ioctl、termio、canonical、noncanonicalをグーグルで検索すると、すぐに答えが得られます。

しかし、誰かがあなたのために数行のコードを投稿してくれることを願っています! 申し訳ありませんが、1 分しかお答えできません。

于 2013-04-01T14:40:23.900 に答える