たとえば、DBIドキュメントの2番目のタイムアウトの例に示されているように、Perlセーフ信号をバイパスすることによって引き起こされるリスクは、そのようなバイパスを使用するコードのみに関係しますか?
2 に答える
それは一体何の意味ですか?安全でないシグナルを使用することにより、Perlの内部変数とPerl変数を破壊する可能性があります。また、再入可能でないCライブラリ呼び出しが中断された場合にも問題が発生する可能性があります。
これはSEGFAULTやその他の問題につながる可能性があり、それらはタイムアウトが有効になっているブロックの外でのみ現れる可能性があります。
その例のコードは、コードのそのセクションだけ、またはそこから呼び出されたコードに変更をローカライズするために一生懸命働いています。
信号はもはや安全ではないため、安全な信号をバイパスするコードの外部でコードが影響を受けないという100%の保証はありません。この例では、タイムアウトになる呼び出しはDBI->connectです。ほとんどのDBDの場合、これはほとんどCで実装されます。ただし、Cコードが中止を処理して再試行できない限り、DBDの内部の一部のデータ構造またはDBDが使用するライブラリが不定の状態のままになることがあります。
サンプルコードがうまくいかない可能性はおそらく信じられないほど小さいです。この問題に関する私の個人的な逸話は、安全な信号が導入される前に、従来のPerl信号処理を何年も使用しており、長い間問題が発生したことはなかったということです。シグナルハンドラーで何をしたかについては、あまり慎重ではありませんでした。次に、100回の実行のうち約1回で実際にメモリの破損を引き起こしたデータセットをヒットすることができました。例と同様のより良い方法を使用するようにシグナルハンドラーを変更するだけで、問題が解消されました。