Sigaction 并将 Linux 代码移植到 Windows

2023-11-24

我正在尝试移植caffe(针对Linux开发)源代码到Windows环境。问题在于sigaction结构在signal_handler.cpp and signal_handler.h。源代码如下所示。 我的疑问是可以替换哪个库或代码来实现此目的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, &sa, 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, &sa, NULL) == -1) {
            LOG(FATAL) << "Cannot uninstall SIGHUP handler.";
          }
          if (sigaction(SIGINT, &sa, 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

基于@nneonneo:

void handle_signal(int signal) {
    switch (signal) {
#ifdef _WIN32
    case SIGTERM:
    case SIGABRT:
    case SIGBREAK:
#else
    case SIGHUP:
#endif
      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;
#ifdef _WIN32
    signal(SIGINT, handle_signal);
    signal(SIGTERM, handle_signal);
    signal(SIGABRT, handle_signal);
#else
    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, &sa, NULL) == -1) {
      LOG(FATAL) << "Cannot install SIGINT handler.";
    }
#endif
  }
 void UnhookHandler() {
    if (already_hooked_up) {
#ifdef _WIN32
        signal(SIGINT, SIG_DFL);
        signal(SIGTERM, SIG_DFL);
        signal(SIGABRT, SIG_DFL);
#else
      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, &sa, NULL) == -1) {
        LOG(FATAL) << "Cannot uninstall SIGHUP handler.";
      }
      if (sigaction(SIGINT, &sa, NULL) == -1) {
        LOG(FATAL) << "Cannot uninstall SIGINT handler.";
      }
#endif

      already_hooked_up = false;
    }
  }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Sigaction 并将 Linux 代码移植到 Windows 的相关文章

  • std::vector 与 std::stack

    有什么区别std vector and std stack 显然 向量可以删除集合中的项目 尽管比列表慢得多 而堆栈被构建为仅后进先出的集合 然而 堆栈对于最终物品操作是否更快 它是链表还是动态重新分配的数组 我找不到关于堆栈的太多信息 但
  • 为什么 GCC 不允许我创建“内联静态 std::stringstream”?

    我将直接前往 MCVE include
  • 传递给函数时多维数组的指针类型是什么? [复制]

    这个问题在这里已经有答案了 我在大学课堂上学习了 C 语言和指针 除了多维数组和指针之间的相似性之外 我认为我已经很好地掌握了这个概念 我认为由于所有数组 甚至多维 都存储在连续内存中 因此您可以安全地将其转换为int 假设给定的数组是in
  • 如何从本机 C(++) DLL 调用 .NET (C#) 代码?

    我有一个 C app exe 和一个 C my dll my dll NET 项目链接到本机 C DLL mynat dll 外部 C DLL 接口 并且从 C 调用 C DLL 可以正常工作 通过使用 DllImport mynat dl
  • 从经典 ASP 调用 .Net C# DLL 方法

    我正在开发一个经典的 asp 项目 该项目需要将字符串发送到 DLL DLL 会将其序列化并发送到 Zebra 热敏打印机 我已经构建了我的 DLL 并使用它注册了regasm其次是 代码库这使得 IIS 能够识别它 虽然我可以设置我的对象
  • 如何在 C++ 中标记字符串?

    Java有一个方便的分割方法 String str The quick brown fox String results str split 在 C 中是否有一种简单的方法可以做到这一点 The 增强分词器 http www boost o
  • 访问外部窗口句柄

    我当前正在处理的程序有问题 这是由于 vista Windows 7 中增强的安全性引起的 特别是 UIPI 它阻止完整性级别较低的窗口与较高完整性级别的窗口 对话 就我而言 我想告诉具有高完整性级别的窗口进入我们的应用程序 它在 XP 或
  • 重载 (c)begin/(c)end

    我试图超载 c begin c end类的函数 以便能够调用 C 11 基于范围的 for 循环 它在大多数情况下都有效 但我无法理解和解决其中一个问题 for auto const point fProjectData gt getPoi
  • C# 列表通用扩展方法与非通用扩展方法

    这是一个简单的问题 我希望 集合类中有通用和非通用方法 例如List
  • 如何获取 EF 中与组合(键/值)列表匹配的记录?

    我有一个数据库表 其中包含每个用户 年份组合的记录 如何使用 EF 和用户 ID 年份组合列表从数据库获取数据 组合示例 UserId Year 1 2015 1 2016 1 2018 12 2016 12 2019 3 2015 91
  • x:将 ViewModel 方法绑定到 DataTemplate 内的事件

    我基本上问同样的问题这个人 https stackoverflow com questions 10752448 binding to viewmodels property from a template 但在较新的背景下x Bind V
  • C 编程:带有数组的函数

    我正在尝试编写一个函数 该函数查找行为 4 列为 4 的二维数组中的最大值 其中二维数组填充有用户输入 我知道我的主要错误是函数中的数组 但我不确定它是什么 如果有人能够找到我出错的地方而不是编写新代码 我将不胜感激 除非我刚去南方 我的尝
  • LINQ:使用 INNER JOIN、Group 和 SUM

    我正在尝试使用 LINQ 执行以下 SQL 最接近的是执行交叉联接和总和计算 我知道必须有更好的方法来编写它 所以我向堆栈团队寻求帮助 SELECT T1 Column1 T1 Column2 SUM T3 Column1 AS Amoun
  • 如何实例化 ODataQueryOptions

    我有一个工作 简化 ODataController用下面的方法 public class MyTypeController ODataController HttpGet EnableQuery ODataRoute myTypes pub
  • 如何在 Linq to SQL 中使用distinct 和 group by

    我正在尝试将以下 sql 转换为 Linq 2 SQL select groupId count distinct userId from processroundissueinstance group by groupId 这是我的代码
  • 有没有办法让 doxygen 自动处理未记录的 C 代码?

    通常它会忽略未记录的 C 文件 但我想测试 Callgraph 功能 例如 您知道在不更改 C 文件的情况下解决此问题的方法吗 设置变量EXTRACT ALL YES在你的 Doxyfile 中
  • C++ 中的参考文献

    我偶尔会在 StackOverflow 上看到代码 询问一些涉及函数的重载歧义 例如 void foo int param 我的问题是 为什么会出现这种情况 或者更确切地说 你什么时候会有 对参考的参考 这与普通的旧参考有何不同 我从未在现
  • DotNetZip:如何提取文件,但忽略zip文件中的路径?

    尝试将文件提取到给定文件夹 忽略 zip 文件中的路径 但似乎没有办法 考虑到其中实现的所有其他好东西 这似乎是一个相当基本的要求 我缺少什么 代码是 using Ionic Zip ZipFile zf Ionic Zip ZipFile
  • 指针和内存范围

    我已经用 C 语言编程有一段时间了 但对 C 语言还是很陌生 有时我对 C 处理内存的方式感到困惑 考虑以下有效的 C 代码片段 const char string void where is this pointer variable l
  • Mono 应用程序在非阻塞套接字发送时冻结

    我在 debian 9 上的 mono 下运行一个服务器应用程序 大约有 1000 2000 个客户端连接 并且应用程序经常冻结 CPU 使用率达到 100 我执行 kill QUIT pid 来获取线程堆栈转储 但它总是卡在这个位置

随机推荐

  • 是否有一种*干净的*方法可以使只读依赖属性反映另一个属性的值?

    下面的代码是我当前的解决方案 我试图模仿的一个很好的例子是 FrameworkElement ActualWidth 属性 您知道每当 Width 属性更改 或重新绘制控件或其他任何时候 如何计算和重新分配 ActualWidth 属性吗
  • 访问令牌的“无效签名”错误(Azure Active Directory / msal js)

    我使用 MSAL JS 来验证用户身份 然后调用 acquireTokenPopup scopes 来获取访问令牌 我正在获取访问令牌 但无法按照其说明使用它签名无效 也在 jwt io 中检查过 同样的错误 在论坛上我发现这是由于 Gra
  • python 将多行转换为单行

    我想将 Python 多行字符串转换为单行 如果我在 Vim 中打开字符串 我可以在每行的开头看到 M 如何处理字符串以使其全部位于一行中 并在每行之间使用制表符分隔 Vim 中的示例如下所示 Serialnumber MName Rick
  • 获取C中的当前时间[重复]

    这个问题在这里已经有答案了 我想获取系统的当前时间 为此 我在 C 中使用以下代码 time t now struct tm mytime localtime now if strftime buffer sizeof buffer X m
  • 如何使用匹配节点连接两个 XML 文件

    我需要找到一种方法 当两个 XML 文件具有匹配的节点时将它们连接起来 据我所知 这可以用许多不同的语言来完成 是否有 PHP 或 AJAX 方法来做到这一点 从 SO 上的其他帖子中我看到了 XSLT 解决方案 但我并没有真正理解 这是最
  • .NET 从 HTML 页面中删除/剥离 JavaScript 和 CSS 代码块

    我有带有 JavaScript 和 CSS 代码块的 HTML 字符串 如何剥离这些块 关于可用于删除这些的正则表达式有什么建议吗 快速的 n 脏方法将是一个像这样的正则表达式
  • 如何使用 Javascript 对 HTML 文档进行永久更改?

    我有一个简单的计数器代码 但所做的更改消失了 页面刷新后 为什么会发生这种情况 应该使用 PHP 来完成吗 如何更有效地编写这段代码 无论如何 这不是主要问题 var like document getElementById like im
  • 在另一个页面中获取magento会话变量

    我在 magento 模式页面的会话中设置数组变量 并希望在另一个页面 如 getuserdata php 中检索 但不进入另一个页面 我设置变量并进入一页 然后完全检索 我的代码就像 首页代码 session Mage getSingle
  • 我们有 Perl 中的 autochomp 吗?

    这就是我的 Perl 代码的样子监控 Unix 文件夹 usr bin perl use strict use warnings use File Spec Functions my date date chomp date my date
  • XCode 5 中的配置文件

    我今天开始使用 XCode 5 并在尝试归档一个项目以进行临时分发时发现 我看到的配置文件不包括我最近创建的配置文件 但确实包括我已删除的配置文件 我检查了我的管理器中该设备的配置文件列表 该列表没问题 并且包含我最近下载的配置文件 所以我
  • c#:将网页的html源代码读取为字符串[重复]

    这个问题在这里已经有答案了 我希望能够使用 winforms 将某个网页的 html 源读入 C 中的字符串 我该怎么做呢 string html new WebClient DownloadString http twitter com
  • ASP.NET 主题样式表渲染

    当呈现具有主题的页面时 给定主题中的样式表链接标记将呈现在结束头标记之前 有谁知道有什么方法可以改变这种情况吗 有没有办法让我可以将这些标签放置在起始头标签之后 我知道它可以通过jquery关闭 只需选择所有链接标签并将其放置在起始头标签之
  • 如何在groovy中合并两个地图

    问题 如何合并映射 同时求和映射之间公共键的值 Input a 10 b 2 c 3 b 3 c 2 d 5 Output a 10 b 5 c 5 d 5 扩展问题 如何通过对 2 个映射中的公共键的值应用函数 闭包 来合并原始的 2 个
  • 解组时未找到类:android.support.v7.widget.Toolbar$SavedState

    我正在使用 Maps API 创建一个简单的 Android 应用程序 但出现了一个我无法解决的奇怪错误 当我旋转设备时通常会发生这种情况 我正在使用谷歌服务8 4 0 4 23 15 39 47 503 9419 9419 com lic
  • 在 Ubuntu C++ 上找不到 gtk/gtk.h

    我对编程相当陌生 尤其是在涉及如何包含库和类似活动时 我过去曾使用 Python 进行过一些编程 并且一直使用 GTK 来创建窗口 这也是我在使用 C 编程时打算做的事情 首先 这是我的代码 include
  • VsTac 任务失败,使用全局 Cordova 工具集时找不到文件 appAsTgz.tgz

    当我使用全局安装的 Cordova 7 1 0 工具集并执行 iOS 远程构建 到模拟器或本地设备 时 我几乎立即收到错误消息 Error MSB4018 The VsTac task failed unexpectedly System
  • 积分推广与运营商+=

    我需要消除 gcc Wconversion 警告 例如 typedef unsigned short uint16 t uint16 t a 1 uint16 t b 2 b a gives warning conversion to ui
  • 使用 JQuery 禁用链接

    我有以下代码 其功能类似于 Stackoverflow 上评论链接的工作方式 单击时 它会触发 ActionResult 并填充 div function a id doneLink live click function event ma
  • Chrome:播放通过 fetch/XHR 下载的视频

    我想要实现的是让 Chrome 将视频文件作为数据加载 通过 Fetch API XHR 等 并使用
  • Sigaction 并将 Linux 代码移植到 Windows

    我正在尝试移植caffe 针对Linux开发 源代码到Windows环境 问题在于sigaction结构在signal handler cpp and signal handler h 源代码如下所示 我的疑问是可以替换哪个库或代码来实现此