質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.06%

シグナルハンドラ内では非同期安全関数を使わなければいけないが・・・?

受付中

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 261

kazuyakazuya

score 151

まず私が考えている言葉の定義

リエントラント・・・あるプログラムやサブルーチンの実行を完了する前に、割り込みなどにより、同じプログラムやサブルーチンを実行しても安全だという性質を指す。

非同期安全関数・・・上記を達成するための手段としてセマフォ、スピンロックなどの同期プリミティブを使ってはならない。
同期プリミティブを使わずリエントラントを達成したもの。

シグナルハンドラ内部では非同期安全関数を使わなければならず
スピンロックなどの手段を使っているリエントラントな関数を呼びだすのもNG
(デッドロックするみたい)
割込みハンドラ(ハードウエア割り込み)、例外ハンドラ内部では非同期安全関数は使う必要はありますか?

自分はする必要があるんじゃないかと思っていますが・・・

一応調べましたが
割り込みハンドラ内では非同期安全関数を使いましょう。
といったようなことが書かれている記事はみたことがありません。

知ってて当たり前だから省略されて書かれていないのかな・・・?

環境はx86,OSはLinuxを前提にお願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • kazuyakazuya

    2020/08/03 11:40

    x86 Linux

    キャンセル

  • maisumakun

    2020/08/03 11:43

    「気になっただけ」にしても、実際にどのような環境で動かすのかがはっきりしないと、「環境依存」としか言えません。

    キャンセル

  • kazuyakazuya

    2020/08/03 11:46

    x86,Linux以外に必要な情報がありましたら教えてください。
    (自分はこれ以上思いつかなかったが・・・)

    キャンセル

回答 3

0

ハードウエア割り込み内ではセマフォ、スピンロックなどの同期プリミティブってのは使えません。
それらは、あくまでOSでの非同期実行を行うための関数なので、ハードウエアレベルでは意味を持ちません

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/08/02 11:40

    ハード割り込みにおいて同期プリミティブが意味を持たない理由がわかりません。
    もうちょっと詳しく教えていただけると助かります

    ハードウエア割り込みは非同期に発生しますが
    それは同期プリミティブを使えない理由にはならない気がしますが。
    (Linuxにおいてのシグナルは受け手から見れば同期ともいえるかな)

    キャンセル

  • 2020/08/02 11:46

    それらはOSの機能として用意されてるってことはわかりますか?
    しかし、ハードウエア割り込みはOSで発生するものではありません

    キャンセル

  • 2020/08/02 11:54

    同期プリミティブ・シグナルはOSの機能だということは理解しています。
    ハードウエア割り込みは非同期に外部デバイスがトリガーとなり発生しますが
    トリガーによって発生する内容というのはOSが決められるはずです。
    その内容(割り込みハンドラ)に同期プリミティブの仕組みを取り入れることもできるんじゃないかと思うのですが

    キャンセル

  • 2020/08/02 12:25

    アプリのシグナルハンドラ、ハードウェア割込みに起因するLinuxカーネルの割込みハンドラ、デバイスドライバーの話のレベルが交錯している気がしますが、ハードウェア割込みでのデバイスドライバーの割込みハンドラー内において、スピンロック、セマフォなどのLinuxカーネルの用意した同期、待機メカニズムは使えるか使えないか(=コードとして呼び出せるか)で言ったら、使えます。セマフォに関しては、ハードウェア割込みハンドラの中で即、使うような状況はちょっと思い付きませんが。以上、コメントのみです。もちろん、間違いのご指摘があれば受け付けます。

    キャンセル

0

割り込みハンドラ内では非同期安全関数を使いましょう。
といったようなことが書かれている記事はみたことがありません。

JPCERT CC「SIG30-C. シグナルハンドラ内では非同期安全な関数のみを呼び出す

POSIX仕様を定める IEEE Std 1003.1-2017, 2.4.3 Signal Actionsには 非同期シグナルセーフ(async-signal-safe) な関数を列挙しています。


環境はx86,OSはLinuxを前提

Linuxでのハードウェア割り込み処理は、デバイスドライバとして実現されます。

たとえば Linux Device Drivers, 3rd Ed., Chap10. Interrupt Handling, Implementing a Handler では、下記のように説明されています。

The only peculiarity is that a handler runs at interrupt time and, therefore, suffers some restrictions on what it can do. These restrictions are the same as those we saw with kernel timers. A handler can't transfer data to or from user space, because it doesn't execute in the context of a process. Handlers also cannot do anything that would sleep, such as calling wait_event, allocating memory with anything other than GFP_ATOMIC, or locking a semaphore. Finally, handlers cannot call schedule.
  The role of an interrupt handler is to give feedback to its device about interrupt reception and to read or write data according to the meaning of the interrupt being serviced. The first step usually consists of clearing a bit on the interface board; most hardware devices won't generate other interrupts until their "interrupt-pending" bit has been cleared. Depending on how your hardware works, this step may need to be performed last instead of first; there is no catch-all rule here. Some devices don't require this step, because they don't have an "interrupt-pending" bit; such devices are a minority, although the parallel port is one of them. For that reason, short does not have to clear such a bit.

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/08/02 20:07

    シグナルハンドラと割り込みハンドラは明確に違うはず。
    JPCERT CC「SIG30-C. シグナルハンドラ内では非同期安全な関数のみを呼び出す」
    ここではシグナルハンドラに関してしか記述されていないように見えるのですが

    キャンセル

  • 2020/08/03 11:06 編集

    質問の主題は「ソフトウェア割り込み=シグナル」ではなく「ハードウェア割り込み」でしょうか?
    OSに強く依存すると思いますので、そのあたりを明記されたほうが宜しいかと。

    JPCERTやPOSIX引用はいずれもユーザランド・アプリケーションを対象にした話かと思います。

    キャンセル

  • 2020/08/04 00:35

    ありがとうございます、読んでみます

    キャンセル

0

割込みハンドラ(ハードウエア割り込み)、例外ハンドラ内部では非同期安全関数は使う必要はありますか?
環境はx86,OSはLinuxを前提にお願いします。

このような環境であれば、CPUレベルの割り込みや例外はすべてOSが管理するので、自分でハンドラを書いてはいけない(Linuxを経由せずにセットしようとしても正常に動作しない)のではないでしょうか。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/08/05 12:24

    すみません 以下のどっちの意味ですか?

    ・割り込みハンドラ内で呼ぶ関数は非同期安全関数であればなんでもかなわない
    というわけではないかもしれない

    キャンセル

  • 2020/08/05 12:26

    選択肢が1つしか示されていないようですが?

    キャンセル

  • 2020/08/05 12:56

    あれ・・・?
    もう一回載せますね。

    ・割り込みハンドラ内で呼ぶ関数は非同期安全関数であればなんでもかなわない
    というわけではないかもしれない
    ・割り込みハンドラ内で呼ぶ関数は必ずしも非同期安全関数でなければいけない
    というわけではないかもしれない

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.06%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る