趣味のプログラム工房

Linux、Pro*C環境でsystem関数の挙動が変(signal?)

Oracle 11.2以降、Linux、Pro*Cを利用の環境でsystem関数などの子プロセスを呼び出した後のシグナルの挙動が変という問題。

具体的には、Oracle 11.2以降(当方は12cで確認)は、SIGCHLDSIG_IGNを設定したような挙動となります。(Oracleに接続する関数を呼び出した後)

つまり、どういうことかというと、Oracle 10gの場合は、system関数を利用して子プロセスを呼び出した後、普通にその結果(終了コード)を拾えるのですが、11.2の場合は、子プロセスはゾンビ化しないため、勝手に状態の開放を行うため、親プロセス状態を拾うことができなくなります。
つまり、system関数の結果(終了コード)が拾えなくなります。

どうも、Oracleでバグが発生し、こねくり回して対応した結果の仕様のようです。

解決方法としては、、
①SIGCHLDにSIG_DEFを設定しなおす。
②sqlnet.oraでBEQUEATH_DETACH=yesを設定。

らしいですが、Oracleがそのほかの部分でどういう挙動となるかはよくわかりません。
ほかの不具合が発生する可能性が高いです。。。

参考
https://www.developpez.net/forums/d1800160/bases-donnees/oracle/interfaces-programmation/pro-c-comportement-different-cmd-system-connecte-oracle/
2018年12月23日