c – 将Linux代码映射和移植到Windows
发布时间:2020-12-16 04:54:22 所属栏目:百科 来源:网络整理
导读:我正在尝试将 caffe(为Linux开发)源代码移植到Windows环境中.问题出在signal_handler.cpp和signal_handler.h的sigaction结构上.源代码如下所示. 我的查询是可以执行哪些库或代码替换,以使此sigaction在Windows中正常工作. ///头文件 #ifndef INCLUDE_CAFFE_U
我正在尝试将
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 <boost/bind.hpp> #include <glog/logging.h> #include <signal.h> #include <csignal> #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 错误是 .srccaffeutilsignal_handler.cpp(39): error C2065: 'SIGHUP' : undeclared identifier 1>..srccaffeutilsignal_handler.cpp(42): error C2514: '`anonymous-namespace'::HookupHandler::sigaction' : class has no constructors 1> ..srccaffeutilsignal_handler.cpp(31) : see declaration of '`anonymous-namespace'::HookupHandler::sigaction' 1>..srccaffeutilsignal_handler.cpp(50): error C2079: 'sa' uses undefined struct '`anonymous-namespace'::UnhookHandler::sigaction' 1>..srccaffeutilsignal_handler.cpp(52): error C2228: left of '.sa_handler' must have class/struct/union 1> type is 'int' 1>..srccaffeutilsignal_handler.cpp(54): error C2228: left of '.sa_flags' must have class/struct/union 1> type is 'int' 1>..srccaffeutilsignal_handler.cpp(54): error C2065: 'SA_RESTART' : undeclared identifier 1>..srccaffeutilsignal_handler.cpp(56): error C2228: left of '.sa_mask' must have class/struct/union 解决方法
sigaction是UNIX信号API的一部分. Windows仅提供信号,不支持SIGHUP或任何标志(例如SA_RESTART).但是,仍然存在非常基本的支持,因此如果仅使用信号(而不是sigaction),代码仍应合理正确地工作.
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |