标签: signal-handling

将SIGINT发送到python的子进程

我有一个在Windows上管理gdb进程的python脚本,我需要能够将SIGINT发送到生成的进程以暂停目标进程(由gdb管理)

似乎win32中只有SIGTERM可用,但很明显,如果我从控制台和Ctrl + C运行gdb,它认为它正在接收SIGINT.有没有办法可以假装这个功能,以便在所有平台上都可以使用这些功能?

(我使用的是子进程模块,以及python 2.5/2.6)

python windows subprocess signal-handling sigint

5
推荐指数
1
解决办法
5416
查看次数

如何处理和移动段错误?

我正在研究一个涉及链表的C项目,我需要对一段代码进行分段,以证明它不起作用.但我的代码不能崩溃.

到目前为止,这是我的处理程序:

typedef void sigfunc(int);
sigfunc *signal(int, sigfunc*);
void Handler(int sig)
{
    if (sig == SIGSEGV)
    printf("received SegFault\n");
    signal(SIGSEGV, &Handler);
}
Run Code Online (Sandbox Code Playgroud)

它需要在段错误中存活下来.到目前为止,我得到的是"收到的SegFault"的无限循环.提前致谢!

c signal-handling segmentation-fault

5
推荐指数
1
解决办法
4129
查看次数

如何在Linux 32位计算机上解决REG_EIP未声明(在此函数中首次使用)错误?

我在使用gcc编写用C语言编写的信号处理程序时遇到错误,在出现Segmentation fault之后显示转储的寄存器值.当我尝试使用代码访问它时:

void print_registers(FILE *fd, ucontext_t *ctx, bool fpu = false)
{
        const char *flags_str[] = {
                "CF", 0, "PF", 0, "AF", 0, "ZF", "SF", "TP", "IF", "DF",
                "OF", 0, 0, "NT", 0, "RF", "VM", "AC", "VIF", "VIP", "ID"
        };

        greg_t *regs = ctx->uc_mcontext.gregs;

        void *eip[1] = { (void*)regs[REG_EIP] };

        char **symbol = backtrace_symbols(eip, 1);

        fprintf(fd, "Registers:\neip is at ");

         backtrace_symbols_fd(eip, 1, fd->_fileno);

        size_type flags = regs[REG_EFL];
        fprintf(fd, "eflags: %x [ ", flags);
        for (size_type i = 0; i < …
Run Code Online (Sandbox Code Playgroud)

c linux gcc signal-handling

4
推荐指数
2
解决办法
9012
查看次数

最重要的信号要处理?

最近我正在研究一个用c编写的软件,它有大约3-4万行代码.当我开始出现分段错误时,我添加了一个SIGSEGV处理程序.这帮助我指出错误,因为处理程序是给一个回溯.

我的问题是除了SIGSEGV之外,当我们拥有一个大型软件时,应该处理哪些重要信号,以便错误检测很容易.

这可以任选地用于防止攻击.Ex软件在进行关键更新/操作时接收中止信号.标准告诉SIGHUP,SIGINT,SIGKILL,SIGPIPE,SIGTERM和一些其他信号具有默认属性来终止传递此信号的进程.

因此,要为我的软件添加另一层保护,我将不得不改变这些信号的行为.通过保护我的意思是我不希望我的软件在crtical更新之间终止,我将决定何时中止.

编辑:我想知道如何设计好的软件,处理SIGNAL,像安全网一样使用它们,这有助于软件的构建.

c debugging signals signal-handling

4
推荐指数
1
解决办法
760
查看次数

奇怪的 sigaction() 和 getline() 交互

我有一个使用 sigaction 设置的信号处理程序,如下所示:

struct sigaction act, oldact;
memset(&act, 0, sizeof(struct sigaction));
act.sa_handler = sig_handler;
sigemptyset(&act.sa_mask);
sigaddset(&act.sa_mask, SIGALRM);
sigaddset(&act.sa_mask, SIGINT);
sigaddset(&act.sa_mask, SIGTERM);
sigaddset(&act.sa_mask, SIGTSTP);
sigaction(SIGALRM, &act, &oldact);
sigaction(SIGINT, &act, &oldact);
sigaction(SIGTERM, &act, &oldact);
sigaction(SIGTSTP, &act, &oldact);
act.sa_flags = 0;
Run Code Online (Sandbox Code Playgroud)

在此之后,我运行一个 for 循环来收集输入并将其打印出来(基本上就像 cat 一样)。

char *linebuf = NULL;
size_t n = 0;
int len;
while(1){
    len = getline(&linebuf, &n, stdin);
    if(len>0){
        printf("%s", linebuf);
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,一旦我从处理的信号,返回getline()输入不再阻止,而是始终如一的回报-1,同时设置errnoEINTR这是一个中断的系统调用。我显然打算中断getline(),但如何重置它以便我可以继续读取输入?

有一些类似的问题并没有真正解决我的问题,但它可能会帮助您更好地理解问题。1 2

另一个有趣的花絮是我在signal() …

c signals getline signal-handling

4
推荐指数
1
解决办法
2224
查看次数

对向量(vector :: operator []和vector :: size())的只读访问是否是异步安全的?

我的程序需要对vector<string>信号处理程序中的a 的内容执行只读访问SIGINT.(另一种方法是使用固定大小的固定长度C字符串数组.)该程序设计为在POSIX环境中运行.

vector::operator[]vector::size()异步安全(或信号安全)?

c++ posix vector signal-handling async-safe

4
推荐指数
1
解决办法
458
查看次数

在Linux上以发行版/优化的二进制文件在信号处理程序中打印回溯

问题在于以编程方式在优化的二进制文件中打印有意义的stacktrace。例如,我们可以使用backtrace,backtrace_symbols,abi :: __ cxa_demangle打印堆栈跟踪。但据我所知,我们需要使用编译器标志-g而不是-O1优化标志来构建二进制文件。我可以做到的。

我期待在发行二进制文件(例如,用-03标志编译)中生成具有正确函数名称的回溯。

可行吗?我对此进行了大量研究,但没有任何实质性意义。

更新1:有没有一种方法可以让我们创建一个包含一些符号的辅助文件,并且可以在优化的二进制过程中引用该文件来生成堆栈跟踪?

c c++ stack-trace backtrace signal-handling

4
推荐指数
1
解决办法
112
查看次数

使用fork()和信号处理时输出奇怪

#include<stdio.h>
#include<stdlib.h>
#include<signal.h>
#include<unistd.h>
#include<sys/types.h>

void sighup()
{
    signal(SIGHUP,sighup);
    printf("Received SIGHUP! Happy Now ??\n");
}

void sigbus()
{
    signal(SIGBUS,sigbus);
    printf("received SIGBUS! Get a life dude !\n");
}

void sigquit()
{
    printf("I am done with you. Bye!!\n");
    fflush(stdout);
    exit(0);
}

int main()
{   
    int pid = fork();

    if (pid < 0)
    {
        perror("fork");
        exit(1);
    }

    if (pid == 0)
    {   
        printf("child\n");

        signal(SIGHUP,sighup);
        signal(SIGBUS,sigbus);
        signal(SIGQUIT,sigquit);
        while(1)
        {
            ;
        }
    }
    else
    {
        printf("parent\n");
        kill(pid, SIGHUP);
        kill(pid, SIGBUS);
        kill(pid, SIGQUIT);

        wait();
    }
} …
Run Code Online (Sandbox Code Playgroud)

c fork signals signal-handling

3
推荐指数
1
解决办法
252
查看次数

在信号处理程序中使用`std :: shared_ptr`和`std :: weak_ptr`是否安全?

我知道这是不是安全的malloc或者free被调用,直接或间接地从信号处理程序.

但是,如果我能保证至少有一个共享引用仍然存在,那么复制构造和销毁其他共享或弱引用是否安全,或者我是否必须自行引用引用计数?

(是的,我知道信号处理人员通常不应该做太多.但这次我有充分的理由.)

c++ signal-handling c++11

3
推荐指数
1
解决办法
149
查看次数

处理同步信号

我试图找到与处理异步信号相比处理同步信号(SIGSEGV、SIGILL 等)的资源。

典型的信号处理机制(例如使用 kill)在从内核到用户模式的控制转移时调用信号处理程序。我的理解是,“同步”信号更像是一个系统调用,因为控制立即转移到内核 - 可能是因为同步信号通常与 CPU 中断(内存保护等)相关联,并且无论如何都会调用内核处理程序。

  1. 在同步信号处理程序中使用其他“异步信号不安全”的 libc 函数是否安全?例如,我看到 Linux mprotect(2) 手册页在 SIGSEGV 处理程序中使用了 printf。如何确定在这些情况下是否可以使用函数?

  2. 典型的类 Unix 内核对同步信号的处理与其对异步信号的处理有何不同?是什么让它们“同步”?

c unix signal-handling linux-kernel

3
推荐指数
1
解决办法
2228
查看次数