12

当使用 Pro*C(来自 Oracle 的用于 C 代码的嵌入式 SQL 预处理器)或 OCI 时,我注意到 connect/init 例程安装了一些信号处理程序。

这意味着之前

EXEC SQL CONNECT :username IDENTIFIED BY :password USING :dbspec ;

或一个

OCIEnvNlsCreate()

例如,我可以验证这些信号具有以下处理程序:

No              NAME                Pointer   SA_SIGINFO   SIG_DFL   SIG_IGN
―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――
 1            SIGHUP                  (nil)        false      true     false
 2            SIGINT                  (nil)        false      true     false
 3           SIGQUIT                  (nil)        false      true     false
 4            SIGILL                  (nil)        false      true     false
 5           SIGTRAP                  (nil)        false      true     false
 6           SIGABRT                  (nil)        false      true     false
 7            SIGBUS                  (nil)        false      true     false
 8            SIGFPE                  (nil)        false      true     false
 9           SIGKILL                  (nil)        false      true     false
10           SIGUSR1                  (nil)        false      true     false
11           SIGSEGV                  (nil)        false      true     false
12           SIGUSR2                  (nil)        false      true     false
13           SIGPIPE                  (nil)        false      true     false
14           SIGALRM                  (nil)        false      true     false

在 connect/init 语句之后,表如下所示:

No              NAME                Pointer   SA_SIGINFO   SIG_DFL   SIG_IGN
―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――
 1            SIGHUP                  (nil)        false      true     false
 2            SIGINT         0x7eff9e60bdac         true     false     false
 3           SIGQUIT         0x7eff9ea17f9c         true     false     false
 4            SIGILL         0x7eff9ea17f9c         true     false     false
 5           SIGTRAP         0x7eff9ea17f9c         true     false     false
 6           SIGABRT         0x7eff9ea17f9c         true     false     false
 7            SIGBUS         0x7eff9ea17f9c         true     false     false
 8            SIGFPE         0x7eff9ea17f9c         true     false     false
 9           SIGKILL                  (nil)        false      true     false
10           SIGUSR1                  (nil)        false      true     false
11           SIGSEGV         0x7eff9ea17f9c         true     false     false
12           SIGUSR2                  (nil)        false      true     false
13           SIGPIPE                    0x1         true     false      true
14           SIGALRM                  (nil)        false      true     false

其中 0x7eff9e60bdac 表示sslsshandler()和 0x7eff9ea17f9c 表示skgesig_sigactionHandler()- 这两个符号都定义在libclntsh.so.11.1- Oracle 运行时库中。

我担心那些 Oracle 信号处理程序,因为它们似乎引入了一些不确定的行为。这意味着取决于操作系统、硬件和段错误/中止类型,我观察到以下行为:

  • 不包含太多有用信息的丑陋堆栈跟踪
  • 以退出状态 1 直接退出程序 - 没有任何核心文件写入并且没有错误消息
  • 退出状态为 0 的直接程序退出(原文如此!)

尤其是最后一个行为是怪诞的。

因此,我对以下内容感兴趣:

  • 动机 - 为什么这些信号处理程序是由 Oracle 安装的?
  • 如何禁用它们?- 至少对于默认产生核心文件的信号 - 因为对于我的用例,我想要在这些情况下(开发期间)或生产中可靠且信息丰富的退出状态的核心
  • 通过例如覆盖Oracle信号处理程序是否安全act.sa_handler = SIG_DFL; sigaction(SIGABRT, &act, 0);
  • 连接后将 SIGABRT/SIGSEGV 和朋友重置为 SIG_DFL 有什么缺点?
4

2 回答 2

9

信号处理和诊断框架注意事项:OCI 诊断框架安装的信号处理程序可能会影响您在应用程序中使用的任何信号处理。您可以通过设置禁用 OCI 信号处理

DIAG_SIGHANDLER_ENABLED=FALSE

在 sqlnet.ora 文件中。有关信息,请参阅Oracle Call Interface Programmer's Guide中的“ OCI中的故障诊断” 。

请尝试在 sqlnet.ora 文件中配置此环境变量

于 2014-02-05T09:08:58.777 回答
1

我会修补 Oracle.so文件以替换sigaction字符串,nosigactn并在您的程序nosigactn中使用与sigaction.

于 2013-06-15T15:27:47.540 回答