使用c ++函数指针作为信号处理程序。

时间:2017-07-26 08:54:57

标签: c++ c

我想在我的代码中添加新的处理程序来发信号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 ++替代品?

谢谢

2 个答案:

答案 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>