首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >西格提夫

西格提夫
EN

Stack Overflow用户
提问于 2013-11-15 09:58:20
回答 1查看 1.2K关注 0票数 0

在C++中使用下面类时,我遇到了一个问题:

代码语言:javascript
复制
class SerialHandler{
private:
...
             
    /* Action Handling */
    struct sigaction receive_handler;
    /* Called using the receive_handler*/
    static void receive_function(int status);
    /* Get byte from the Serial Port */
    unsigned char receive_byte();
    /* Buffer for Singalinterrupt on Reciving */
    std::vector<char> in_char_buffer;
    ...
};

我真的需要在中断/Sigaction上使用一个成员函数(receive_function),因为我需要访问一个成员变量(向量in_char_buffer)。问题:您不能使用sigaction来使用成员函数,因为您必须将一个正常函数传递给sigaction.sa_handler。

正如您所看到的,使用static函数也不是另一种选择,因为您将无法访问成员变量。此外,包装也不会有帮助。您将访问一个新对象,但不访问特定对象。

那么,是否有其他办法可以解决这个问题呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-11-15 11:14:10

像这样的事怎么样:

代码语言:javascript
复制
#include <signal.h>
#include <string.h>

#include <vector>

using namespace std;

class SerialHandler;

// A Singleton class
class SerialHandlerManager
{
private:
    SerialHandlerManager() {};

public:
    static SerialHandlerManager* get_instance();
    void register_handler( int signum, int fd, SerialHandler * handler );

private:
    static void dispatch_signal( int signum, siginfo_t * info, void * context );

private:
    static SerialHandlerManager* the_manager;
    vector<SerialHandler *> handler_objects;
};

class SerialHandler
{
private:
    friend class SerialHandlerManager;
    void install_signal_handler( int signum )
    {
        (SerialHandlerManager::get_instance())->register_handler( signum, fd, this );
    }

    void receive_function( int status );

    int fd;     // file descriptor returned from opening the serial port
};

SerialHandlerManager* SerialHandlerManager::the_manager;

SerialHandlerManager* SerialHandlerManager::get_instance()
{
    if( !the_manager )
        the_manager = new SerialHandlerManager;
    return the_manager;
}

void SerialHandlerManager::register_handler( int signum, int fd, SerialHandler * handler )
{
    struct sigaction act;

    memset( &act, 0, sizeof(struct sigaction));

    act.sa_flags = SA_SIGINFO;
    act.sa_sigaction = SerialHandlerManager::dispatch_signal;

    handler_objects[fd] = handler;
    sigaction( signum, &act, NULL );

}

void SerialHandlerManager::dispatch_signal( int signum, siginfo_t * info, void * context )
{
    (get_instance()->handler_objects[info->si_fd])->receive_function( signum );
}

当然,您可以使用映射将文件描述符链接到对象。这绝不是全面的(或防弹),但我只是一个快速的想法,当我读到你的问题。

祝好运

阿尔温

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19998286

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档