如何在 Linux 上的 VS Code 上捕获 C 程序中的 CTRL+C?

2024-02-03

在 Linux 上用 VS Code 编写 C 代码。

I use;

signal(SIGINT, myhandler); 
signal(SIGHUP, myhandler); 
signal(SIGKILL, myhandler); 
signal(SIGTERM, myhandler); 

我使用 VS 代码内部终端,选中“在终端中运行”选项。

当我的代码在循环中运行时,当我发送组合键 CTRL-C 时,执行会停止,但我的代码(myhandler)没有捕获信号。

我将“处理所有 nostop print pass”添加到 .gdbinit 文件中,但没有任何更改。

问题是如何捕获当前正在 VS Code 中调试的程序中从键盘发送的 CTRL-C (SIGINT)?

为了详细说明,我将添加我的 launch.json、tasks.json 和 main.c 文件,如下:

{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
  {
    "name": "gdb build and debug active file",
    "type": "cppdbg",
    "request": "launch",
    "program": "${fileDirname}/bin/${fileBasenameNoExtension}",
    "args": [],
    "stopAtEntry": false,
    "cwd": "${workspaceFolder}",
    "environment": [],
    "externalConsole": false,
    "MIMode": "gdb",
    "setupCommands": [
      {
        "description": "Enable pretty-printing for gdb",
        "text": "-enable-pretty-printing",
        "ignoreFailures": true
      }
    ],
    "preLaunchTask": "C/C++: gcc build active file",
    "miDebuggerPath": "/usr/bin/gdb"
  }
]

}

{
"version": "2.0.0",
"tasks": [
    {
        "type": "cppbuild",
        "label": "C/C++: gcc build active file",
        "command": "/usr/bin/gcc",
        "args": [
            "-g",
            "${workspaceFolder}/*.c",
            "-o",
            "${fileDirname}/bin/${fileBasenameNoExtension}"
        ],
        "options": {
            "cwd": "${fileDirname}"
        },
        "problemMatcher": [
            "$gcc"
        ],
        "group": {
            "isDefault": true,
            "kind": "build"
            },
        "detail": "compiler: /usr/bin/gcc"
    }
]

}

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>

// function prototypes
void initialize(void);
void sigHandler(int signo);

/*************** main routine which contains the infinite loop ****************/
int main(int argc, char *argv[])
{

    initialize();
    printf("It is alive...");

    while (1)
    {
        // do something
        printf("looping...");
        usleep(10000);
    }

    return 0;

} //------------------------------- main -------------------------------------//

/**
 * Let's get ready and initialize everything.
 */
void initialize(void)
{
    signal(SIGINT, sigHandler);
    signal(SIGHUP, sigHandler);
    signal(SIGKILL, sigHandler);
    signal(SIGTERM, sigHandler);
}


/**
 * Stop before exiting and close everything.
 */
void sigHandler(int signo)
{
    printf("Caught signal: %d, exiting!", signo);
    exit(0);
}

这没有记录,但使用handle all跳过调试器使用的信号,这可以在 GDB 源代码中看到here https://sourceware.org/git/?p=binutils-gdb.git;a=blob;f=gdb/infrun.c;h=edfb5ab0a91f47b1e4f86814f22eae1abbdc8a1a;hb=HEAD#l8915.

由于调试器使用 SIGINT,这意味着 GDB 仍在拦截您发送的 SIGINT,而不是将其转发到您的程序。

你有两种选择,一种是使用:

handle SIGINT ...etc...

专门通过SIGINT。我建议去handle SIGINT stop print pass,这样您仍然可以使用 Ctrl-C 中断您的应用程序,但是当您继续时,GDB 将传递 SIGINT。

如果您确定要将所有信号处理为nostop print pass不过,事实证明 GDB 实际上接受了多个信号handle命令,所以你可以这样做:

handle all SIGINT SIGTRAP nostop print pass

您的另一个选择可能是使用signal SIGINT停止程序后,这将恢复程序,但仅传递一次 SIGINT。信号命令已记录here https://sourceware.org/gdb/current/onlinedocs/gdb.html/Signaling.html#index-signal.

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

如何在 Linux 上的 VS Code 上捕获 C 程序中的 CTRL+C? 的相关文章

  • 在c++中定义一堆静态方法

    哪个是合适的 class xyz static int xyzOp1 static int xyzOp2 OR namespace xyz static int xyzOp1 static int xyzOp2 当我们使用类标签与命名空间标
  • Automapper、Mapper 未初始化。使用正确的配置调用初始化

    当我尝试将数据提交到数据库时 出现以下错误 Success false Error true ErrorType 2 Message System InvalidOperationException Mapper 未初始化 使用适当的配置调
  • asp:repeater 折叠表行 - 已更新

    我想知道是否有人对我的问题有创造性的解决方案 我有一个从我的数据库填充的转发器 如下所示
  • Qt 和 Sqlite 示例

    我正在寻找一些使用 Qt 的示例代码 它是带有 Sqlite 驱动程序的 SQL 模块 我需要示例的主要原因是我之前有 Qt 数据库接口的经验 并且 Sqlite 在字段类型方面有一些奇怪的行为 类型是按字段存储的 而不是按列存储的 The
  • std::map find 在 C++ 中不起作用[重复]

    这个问题在这里已经有答案了 我使用以下几行创建了一个哈希映射和一个迭代器 std map
  • 二叉树和快速排序?

    我有一个家庭作业 内容如下 别生气 担心 我是not请你帮我做作业 编写一个程序 通过使用二分查找的快速排序方法对一组数字进行排序 树 推荐的实现是使用递归算法 这是什么意思 到目前为止 这是我的解释 正如我在下面解释的那样 我认为两者都有
  • 如何在 Windows 上的 GCC 中链接 CS50 C 库

    我是 编程新手 一直在尝试使用以下命令编译我的代码MinGW https en wikipedia org wiki MinGW GCC 但我尝试包括CS50 https en wikipedia org wiki CS50 cs50 c
  • C++:避免​​在重载中将字符串自动转换为布尔值

    我想创建一组方法 这些方法将根据其类型输出具有特殊格式的值 当我这样做时 到目前为止看起来还不错 static void printValue std ostringstream out int value out lt lt value
  • .Net 支持柯里化泛型吗?

    假设我们有一个嵌套的泛型类 public class A
  • 我想找到 C# 代码中所有后面没有括号的 if 语句。通过正则表达式

    我想找到所有if声明和for后面没有大括号的语句 当你在一个文件中写入一行时if声明您大多不会将其括在大括号中 所以我想找到所有这些if and for声明 请帮忙 就像我想捕捉这个声明 if childNode Name B return
  • C 编程中的 rand() 问题? [复制]

    这个问题在这里已经有答案了 可能的重复 为什么我总是用 rand 得到相同的随机数序列 https stackoverflow com questions 1108780 why do i always get the same seque
  • 批量插入,asp.net

    我需要获取与会员相对应的 ID 号列表 在任何给定时间处理的数量可能在 10 到 10 000 之间 我可以毫无问题地收集数据 解析数据并将其加载到 DataTable 或任何内容 C 中 但我想在数据库中执行一些操作 将所有这些数据插入表
  • 为什么 C# 中的命名空间允许循环依赖?

    在 c 中 您可以在文件 a cs 其命名空间为 MyApp A 中拥有一条语句 using MyApp B 而文件 b cs 其名称空间为 MyApp B 已经包含该语句 using MyApp A 如果类似的依赖关系存在于不同的 dll
  • ArrayList 有什么问题?

    最近我问了一个关于 SO 的问题 其中提到了可能使用 c ArrayList 来解决问题 有人评论说使用数组列表不好 我想了解更多有关此的信息 我以前从未听说过关于数组列表的这种说法 有人可以带我了解使用数组列表可能出现的性能问题吗 C n
  • 模板类中模板方法专门化的 clang 自动返回类型错误?

    试图理解另一个问题 https stackoverflow com questions 38054055 clang fails to compile template function with auto return type insi
  • 在 C 中运行 setuid 程序的正确方法

    我有一个权限为4750的进程 我的Linux系统中存在两个用户 root 用户和 appz 用户 该进程继承以 appz 用户身份运行的进程管理器的权限 我有两个基本惯例 void do root void int status statu
  • asio::this_coro::executor 的实现是什么

    在协程函数中 我们可以添加auto ex co await asio this coro executor 获取该协程的执行者 但当我想了解它的定义时 我发现了这个 Awaitable type that returns the execu
  • 对 Action 方法的两个并行 ajax 请求排队,为什么?

    我正在使用 ASP NET MVC 开发一个视频网站 我希望在我的应用程序中拥有的一项功能是转码视频 但由于转码过程可能非常耗时 我想向客户端用户展示该过程的进度 因此 我的架构是使用一个控制器操作来处理整个转码过程 并将其进度写入存储在服
  • C# 使用 .Equals() 比较两个 double

    我使用 ReShaper 当我用 比较两个双精度值时 它建议我应该使用 Math 具有公差的 ABS 方法 看 https www jetbrains com help resharper 2016 2 CompareOfFloatsByE
  • Web 和 winforms 的 .Net 身份验证

    我有一个为客户端构建的 ASP NET Web 应用程序 它使用默认的 ASP NET 表单身份验证 他们现在请求一个能够 与 Web 应用程序一起工作的桌面 WinForms 应用程序 我已经创建了 Web 服务来访问他们想要从 Web

随机推荐

  • 在 Django/Python 中标准化街道地址

    我有一个 Django 表单 其中一个字段是TextInput街道地址 我想标准化数据 例如 gt gt normalize 420 East 24th St 420 E 24th Street gt gt normalize 221 Am
  • 使用 100% cpu 的相对简单的 Python 脚本

    我不会提供代码 因为它太长了 python 脚本涉及执行在 while 循环中运行的大量命令 基本结构 while True The meat goes here with the odd if and stuff 现在我已经完成了它 我注
  • iOS Swift 以编程方式连接 WiFi 并区分密码错误和范围内没有 WiFi

    NEHotspotConfiguration工作正常 但错误是nil当我尝试连接的 SSID 不可用 超出范围或关闭 或我提交的密码不正确时 我究竟做错了什么 我希望能够区分这两种情况 以便我可以相应地通知用户 代码片段 func conn
  • Grunt/Bundler 不会使用指定的 sass 版本

    我们有一个带有 Grunt 和 Bundler 设置的项目 所有这些都安装没有问题 生成了 Gemfile lock 下拉了正确的 gem 并使用 npm 创建了 grunt 文件 我们开始监视该项目 它在 sass 编译上崩溃 因为它使用
  • 测试 DataFrame 中的后续值

    我有一个 DataFrame 其中一列包含正整数和负整数 对于每一行 我想查看有多少连续行 从当前行开始并包括当前行 具有负值 所以如果一个序列是2 1 3 1 1 结果将是0 2 1 0 1 我可以通过迭代所有索引来做到这一点 使用 il
  • Python:如何让我的 tkinter 应用程序正确退出?

    我需要知道如何在 Mac 上执行此操作 因为每当我尝试退出它时 我都必须强制退出它 当用户单击退出按钮时 是否有正确的方法使 Tkinter 正常退出 我知道怎么做了 我只是放了一个简单的exit 主循环之后的命令
  • 在 Win32 / COM 方法上调用 PInvoke 时,通常会出现明显的性能影响吗?

    我想知道是否有人对在托管 Net 代码的 Win32 方法上使用 DLLImport PInvoke 的负面方面有一个不错的解释或概述 我计划使用各种 Win32 方法 并希望更好地了解这样做的负面影响 Thanks Brian 根据MSD
  • 如何在 EF CF 中设置 POCO 的默认值?

    在实体框架代码优先方法中 如何为 POCO 的 EntityConfiguration 类中的属性设置默认值 public class Person public int Id get set public string Name get
  • 应用程序最小化时的 Android 活动和片段生命周期问题

    我有一个带有多项选择列表的片段 我正在尝试保存当前在列表中检查的项目的实例 并在应用程序最小化等情况下恢复它们 测试步骤 到达多选列表片段 检查一些列表项 按主页键最小化应用程序 按多任务按钮并选择我的应用程序来恢复它 以下是我正在使用的代
  • PDFBox - PageDrawer 在 PdfPagePanel 外部绘制

    我正在使用 PDFBox 在我的应用程序中显示生成的 pdf 文件 我将 PdfPagePanel 添加到 JScrollPane 中 当我缩小窗口并出现滚动条时 PageDrawer 会绘制到滚动条上 这种效果也出现在 PDFReader
  • 如何在XSLT中实现if-else语句?

    我试图在 XSLT 中实现 if else 语句 但我的代码无法解析 有人有什么想法吗
  • 显示 git diff,忽略文件权限更改?

    我跑过好几个chmod在我的实时服务器中 现在当我做一个git diff在那里 我看到很多old mode 100644 new mode 100755 我还在那里更改了一些文件 但我只是 git diff 只是为了显示文件上的更改 忽略文
  • 保留的 ASP.NET MVC 控制器名称?

    所以我花了大约一个小时来调试为什么我收到客户端 404 和服务器端System Web Http HttpResponseException on System Web Http dll System Web Http Dispatcher
  • Chromium WebView 不存在

    我正在尝试使用 Phonegap 创建一个 Hello World 应用程序 但当我调用在模拟器上运行该应用程序时 它崩溃了 我遵循了指南here http docs phonegap com en edge guide platforms
  • Scikit-learn 从分段时间序列创建标记数据集

    INTRO 我有一个 Pandas DataFrame 代表分段的不同用户 即 user1 和 user2 的时间序列 我想使用上述 DataFrame 训练 scikit learn 分类器 但我无法理解必须创建的 scikit lear
  • 生成渐变进度条

    我正在使用下面的代码在进度栏中显示渐变 那么如何创建如上图所示的渐变进度条呢 我已经尝试了很多解决方案但还没有成功
  • 这段 PHP 代码有什么作用? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 最近接管一个网站 在多个文件中发现以下代码 认为是恶意代码 关于它的作用有什么想法吗 它似乎 第一行是 POST 第二行检查 POST 是
  • 当属性丢失时,如何强制 System.Text.Json 序列化程序抛出异常?

    Json NET 行为可以通过属性定义 如果 json 负载不包含必需的属性 则使用默认值或仅抛出异常 Yet System Text Json序列化器默默地什么也不做 正在上课 public sealed class Foo Requir
  • 为列的每种不同类型提取多个相似行

    Input col1 col2 col3 apple d 10 apple d 44 apple e 55 orange d 99 orange c 33 orange d 10 banana e 55 banana d 10 所需输出 c
  • 如何在 Linux 上的 VS Code 上捕获 C 程序中的 CTRL+C?

    在 Linux 上用 VS Code 编写 C 代码 I use signal SIGINT myhandler signal SIGHUP myhandler signal SIGKILL myhandler signal SIGTERM