タグ

Linuxとprogrammingに関するbananapenguinのブックマーク (4)

  • dumb-init とは

  • memologue - シグナルハンドラを使わないでシグナルをハンドルする

    「シグナルハンドラの中でできることは非常に限られているんですよ」というお話を1年半くらい前に書きましたが、この話には続きがあって、ある特定の条件下ではこの制限を緩和することができます。今回はその方法についての解説です。sigwait(3)という関数を使います。 ※ この話、うっかり書き忘れていました。ちょっとしたきっかけで思い出したので、暇があるうちに書いておきます。 ■「シグナルを待つ」処理 〜従来の方法〜 皆様、「シグナルの到着を待つ」処理を、次のように書いてしまっていないでしょうか? // シグナルハンドラ void handler(int signo) { // この中で使って良いのは非同期シグナルセーフ(async-signal-safe)な関数のみ }を用意して、 sa.sa_handler = handler; sigaction(SIGHUP, &sa, NULL); ..

    memologue - シグナルハンドラを使わないでシグナルをハンドルする
    bananapenguin
    bananapenguin 2015/02/26
    シグナルハンドラなんていらなかったんや
  • memologue - UNIX上でのC++ソフトウェア設計の定石 (2)

    鉄則2: シグナルハンドラで行ってよい処理を知ろう sigaction関数で登録したシグナルハンドラで行ってよい処理は非常に限定されている 次の3つの処理だけが許されている 自動変数の操作 “volatile sig_atomic_t” 型の大域変数の操作 「非同期シグナルセーフ」関数の呼び出し これ以外の処理を記述しないこと! 説明: シグナル受信時に何らかの処理を行うためには、シグナルハンドラと呼ばれる関数を用意し、それをsigaction関数でシグナル名と紐付けておけばOKです。しかし、シグナルハンドラ内で行ってよい処理は、上記の通り非常に限定されています。これを把握しないまま奔放なコードを書くと次のような現象が起き得ます: 問題1: プログラムがデッドロックする危険がある タイミングに依存する、再現困難なバグの原因となる デッドロックの発生が典型例だが、それ以外にも関数の戻り値不正

    memologue - UNIX上でのC++ソフトウェア設計の定石 (2)
    bananapenguin
    bananapenguin 2015/02/26
    シグナルハンドラと非同期シグナルセーフ関数
  • モダンなC, C++の開発環境の構築方法 - 考える人、コードを書く人

    まだC, C++がないようなので書いてみた。主にLinux(DebianとかUbuntu)での環境構築について。 コンパイラ まずはapt-getでコンパイラをインストールする。UbuntuやDebianなら以下のコマンドでgccやg++および標準ライブラリ等がインストールされる。 $ sudo apt-get install build-essential デバッグツール デバッガおよびデバッグツールは少なくとも以下の三つは入れる。(あとltraceも欲しいかな?) GDB 言わずと知れたGNUのデバッガ Valgrind メモリリークや不正メモリアクセスの検出 strace システムコールのトレース $ sudo apt-get install gdb valgrind strace ビルドツール C, C++のビルドツールといえばまずmakeが浮かぶけど、最近ではSConsやCMak

    モダンなC, C++の開発環境の構築方法 - 考える人、コードを書く人
  • 1