我正在尝试将

caffe(为Linux开发)源代码移植到Windows环境中.问题出在signal_handler.cpp和signal_handler.h的sigaction结构上.源代码如下所示.

我的查询是可以执行哪些库或代码替换,以使此sigaction在Windows中正常工作.

///头文件

#ifndef INCLUDE_CAFFE_UTIL_SIGNAL_HANDLER_H_

#define INCLUDE_CAFFE_UTIL_SIGNAL_HANDLER_H_

#include "caffe/proto/caffe.pb.h"

#include "caffe/solver.hpp"

namespace caffe {

class SignalHandler {

public:

// Contructor. Specify what action to take when a signal is received.

SignalHandler(SolverAction::Enum SIGINT_action,SolverAction::Enum SIGHUP_action);

~SignalHandler();

ActionCallback GetActionFunction();

private:

SolverAction::Enum CheckForSignals() const;

SolverAction::Enum SIGINT_action_;

SolverAction::Enum SIGHUP_action_;

};

} // namespace caffe

#endif // INCLUDE_CAFFE_UTIL_SIGNAL_HANDLER_H_

///源文件

#include

#include

#include

#include

#include "caffe/util/signal_handler.h"

namespace {

static volatile sig_atomic_t got_sigint = false;

static volatile sig_atomic_t got_sighup = false;

static bool already_hooked_up = false;

void handle_signal(int signal) {

switch (signal) {

case SIGHUP:

got_sighup = true;

break;

case SIGINT:

got_sigint = true;

break;

}

}

void HookupHandler() {

if (already_hooked_up) {

LOG(FATAL) << "Tried to hookup signal handlers more than once.";

}

already_hooked_up = true;

struct sigaction sa;

// Setup the handler

sa.sa_handler = &handle_signal;

// Restart the system call,if at all possible

sa.sa_flags = SA_RESTART;

// Block every signal during the handler

sigfillset(&sa.sa_mask);

// Intercept SIGHUP and SIGINT

if (sigaction(SIGHUP,&sa,NULL) == -1) {

LOG(FATAL) << "Cannot install SIGHUP handler.";

}

if (sigaction(SIGINT,NULL) == -1) {

LOG(FATAL) << "Cannot install SIGINT handler.";

}

}

// Set the signal handlers to the default.

void UnhookHandler() {

if (already_hooked_up) {

struct sigaction sa;

// Setup the sighub handler

sa.sa_handler = SIG_DFL;

// Restart the system call,if at all possible

sa.sa_flags = SA_RESTART;

// Block every signal during the handler

sigfillset(&sa.sa_mask);

// Intercept SIGHUP and SIGINT

if (sigaction(SIGHUP,NULL) == -1) {

LOG(FATAL) << "Cannot uninstall SIGHUP handler.";

}

if (sigaction(SIGINT,NULL) == -1) {

LOG(FATAL) << "Cannot uninstall SIGINT handler.";

}

already_hooked_up = false;

}

}

// Return true iff a SIGINT has been received since the last time this

// function was called.

bool GotSIGINT() {

bool result = got_sigint;

got_sigint = false;

return result;

}

// Return true iff a SIGHUP has been received since the last time this

// function was called.

bool GotSIGHUP() {

bool result = got_sighup;

got_sighup = false;

return result;

}

} // namespace

namespace caffe {

SignalHandler::SignalHandler(SolverAction::Enum SIGINT_action,SolverAction::Enum SIGHUP_action):

SIGINT_action_(SIGINT_action),SIGHUP_action_(SIGHUP_action) {

HookupHandler();

}

SignalHandler::~SignalHandler() {

UnhookHandler();

}

SolverAction::Enum SignalHandler::CheckForSignals() const {

if (GotSIGHUP()) {

return SIGHUP_action_;

}

if (GotSIGINT()) {

return SIGINT_action_;

}

return SolverAction::NONE;

}

// Return the function that the solver can use to find out if a snapshot or

// early exit is being requested.

ActionCallback SignalHandler::GetActionFunction() {

return boost::bind(&SignalHandler::CheckForSignals,this);

}

} // namespace caffe

.\src\caffe\util\signal_handler.cpp(39): error C2065: 'SIGHUP' : undeclared identifier

1>..\src\caffe\util\signal_handler.cpp(42): error C2514: '`anonymous-namespace'::HookupHandler::sigaction' : class has no constructors

1> ..\src\caffe\util\signal_handler.cpp(31) : see declaration of '`anonymous-namespace'::HookupHandler::sigaction'

1>..\src\caffe\util\signal_handler.cpp(50): error C2079: 'sa' uses undefined struct '`anonymous-namespace'::UnhookHandler::sigaction'

1>..\src\caffe\util\signal_handler.cpp(52): error C2228: left of '.sa_handler' must have class/struct/union

1> type is 'int'

1>..\src\caffe\util\signal_handler.cpp(54): error C2228: left of '.sa_flags' must have class/struct/union

1> type is 'int'

1>..\src\caffe\util\signal_handler.cpp(54): error C2065: 'SA_RESTART' : undeclared identifier

1>..\src\caffe\util\signal_handler.cpp(56): error C2228: left of '.sa_mask' must have class/struct/union

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐