我想在我的代码中添加新的处理程序来发信号SIGUSR1。此处的signal
签名表单头文件signal.h
:
void (*signal(int, void (*)(int)))(int);
我的处理程序是一个成员函数,所以我使用std::bind
使函数适合signal
接受的输入。
myclass::my_handler(int x);
这是我将会员功能转换为signal
已接受的输入:
std::bind(&myclass::my_handler, this, std::placeholders::_1);
但是,std::bind
返回函数指针的c ++表示形式(a.k.a std::function<void(int)>
),我需要(void)(*)(int)
的C表示。
我是否应该有力地进行演员,或者可能是signal
的c ++替代品?
谢谢
答案 0 :(得分:2)
没有可移植的方法将C ++函数转换为C函数,因为它们可以有不同的ABI。
你可以做的是将全局变量cpphandler声明为 -
std::function<void(int)> cpphandler = NULL;
还将函数声明为 -
extern "C" {
void signal_handler(int i);
}
void signal_handler(int i){
cpphandler(i);
return;
}
现在在你想要创建绑定的函数中 -
cpphandler = std::bind(&myclass::my_handler, this, std::placeholders::_1);
signal(x, signal_handler); //replace x with whatever signal you want to install
这确保使用C ABI创建函数signal_handler
。并使用C ++ ABI调用C ++函数代码。
现在,您可以将signal
功能与signal_handler
一起使用。
答案 1 :(得分:0)
当您使用C ++编译器时,我建议您只需定义一个调用成员函数处理程序的普通函数:
signal(SIGINT, signal_handler_wrapper);
然后在你的主要代码中:
<plugin>
<groupId>com.github.eirslett</groupId>
<artifactId>frontend-maven-plugin</artifactId>
<version>1.2</version>
<configuration>
<installDirectory>target</installDirectory>
</configuration>
<executions>
<execution>
<id>install node and npm</id>
<goals>
<goal>install-node-and-npm</goal>
</goals>
<configuration>
<nodeVersion>v4.4.5</nodeVersion>
<npmVersion>3.9.2</npmVersion>
</configuration>
</execution>
<execution>
<id>npm install</id>
<goals>
<goal>npm</goal>
</goals>
<configuration>
<arguments>install</arguments>
</configuration>
</execution>
<execution>
<id>webpack build</id>
<goals>
<goal>webpack</goal>
</goals>
</execution>
</executions>
</plugin>