c++ - C++ 中的信号处理

标签 c++ signal-handling openvms

void (*)(int) 类型的参数与 __sighnd64_t 类型的参数不兼容

下面是我的简单代码:

#include <iostream>
#include <string>
#include <signal.h>
#include <ctype>
#include <stdlib.h>
#include <stdio.h>
typedef struct mystrcut
{

  int a;
  char *b;

} mystr;

void set_string ( char **, const char * );
void my_handler(int s)
{
    printf("Caught signal %d\n",s);
    exit(1);

}

int main()
{
    const std::string str1[] = {"hello1", "hello2"};
    char str2[50];
    size_t size1 = str1[1].size();
    cout << size1;
    memcpy (str2, str1[1].c_str(), size1);

    cout << str2;
    mystr *m = NULL;
    m = new mystrcut;
    m->a = 5;

    set_string(&m->b, "hello");

    cout << m->b;
    delete []m->b;
//    void (*prev_fn)(int);
    signal (SIGINT,my_handler);
    return 0;
}
void set_string ( char **a, const char *b)
{
    *a = new char [strlen(b)+1];
    strcpy (*a, b);
}

我正在研究 openvms。我可以通过某种类型转换来避免编译错误吗?我的编译器期望 `__sighnd64_t __64_signal(int, __sighnd64_t);

在处理程序 extern c 周围添加已经奏效。谢谢

最佳答案

信号处理不是C++,而是C,这个错误有点奇怪...

在这种情况下,尝试在您的处理程序周围使用 extern "C"(将其定义为 C 函数),如 https://stackoverflow.com/users/775806/n-m评论里说。现代 <signal.h>来自 openvms 的内部已经有 extern "C":http://wasd.vsm.com.au/conan/sys$common/syslib/decc$rtldef.tlb?key=SIGNAL&title=Library%20/sys$common/syslib/decc$rtldef.tlb&referer=http%3A/wasd.vsm.com.au/conan/sys$common/syshlp/helplib.hlb .

惠普 docs says只关于 C,而不是 C++。

Another doc 表示信号处理程序(捕手)必须在 C 中声明为

 void func(int signo);

关于c++ - C++ 中的信号处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6491533/

相关文章:

c - 信号处理输出显示问题

edi - 如何设置 OpenVMS VM 环境

c - 我如何处理和克服段错误?

alpha - OpenVMS Alpha 引导扇区恢复

c++ - Openvms C++ - 如何将值传递给环境

c++ - 如何创建纹理坐标

c++ - 如何填充类型为 "User"的 vector ,该 vector 具有 2 个分量 "username"和 "password"

c++ - boost::future 和 Continuations - 值已设置,但 future 仍然受阻

c++ - 使用编译器生成的默认初始化的成员初始化顺序

c - Linux 上的 C 多线程信号处理