Обработка сигналов в C ++ - PullRequest
5 голосов
/ 27 июня 2011

Аргумент типа 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 сработало.Спасибо

1 Ответ

3 голосов
/ 27 июня 2011

Обработка сигнала - это не C ++, а C. Эта ошибка немного странная ...

В таких случаях попробуйте использовать extern "C" вокруг вашего обработчика (чтобы определить его как функцию C), как сказано в комментариях https://stackoverflow.com/users/775806/n-m.Современный <signal.h> из openvms уже имеет внешнюю букву "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.

HP документы говорят только о C, а не C ++.

Другойdoc говорит, что обработчик сигнала (catcher) должен быть объявлен в C как

 void func(int signo);
...