标签: signal-handling

使用qemu-user进行信号处理

在我的机器上,我有一个aarch64二进制文件,它是静态编译的.我使用带-g 6566标志的qemu-aarch64-static运行它.在另一个终端,我启动gdb-multiarch并连接为target remote localhost:6566.

我希望二进制文件引发一个信号,我在二进制文件中定义了一个处理程序.我gdb-multiarch在连接到远程后从内部设置了一个断点.但是,当信号出现时,断点不会在gdb-multiarch上命中.相反,在运行二进制文件的终端上,我得到一条消息:

[1]     + 8388 suspended (signal)  qemu-aarch64-static -g 6566 ./testbinary
Run Code Online (Sandbox Code Playgroud)

为什么会这样?如何在处理程序上设置断点并对其进行调试?我尝试过SIGCHLD和SIGFPE.

linux gdb signals qemu signal-handling

9
推荐指数
1
解决办法
543
查看次数

OpenMP并行程序中的信号处理

我有一个使用POSIX计时器(timer_create())的程序.本质上,程序设置一个计时器并开始执行一些冗长的(可能是无限的)计算.当计时器到期并且调用信号处理程序时,处理程序将打印出已经计算的最佳结果并退出程序.

我考虑使用OpenMP并行进行计算,因为它应该加速它.

在pthreads中,有一些特殊功能,例如为我的线程设置信号掩码等.OpenMP是否提供这样的控制,或者我必须接受这样的事实:信号可以传递给OpenMP创建的任何线程吗?

此外,如果我当前在我的代码的并行部分并且我的处理程序被调用,它是否仍然可以安全地杀死application(exit(0);)并执行诸如锁定OpenMP锁之类的操作?

c signals pthreads openmp signal-handling

8
推荐指数
1
解决办法
2191
查看次数

是否可以处理本机代码中的SEGFAULT?

我有一个Java 1.6应用程序,通过作为接口提供的JNI类访问第三方本机模块.最近我们注意到SEGFAULT正在本机模块中发生,并导致我们的应用程序崩溃.是否有可能捕获并处理此事件,至少在死亡之前正确记录它?


我在kjp的回答中尝试了两种Java技术.都没有奏效.尝试在'SEGV'上安装信号处理程序会导致异常

VM已使用的信号:SEGV

我安装的关闭处理程序根本无法触发,可能是因为IBM的文章指出:

如果,则不会运行关闭挂钩

调用Runtime.halt()方法来终止JVM.提供Runtime.halt()以允许快速关闭JVM.
指定了-Xrs JVM选项.
JVM异常退出,例如JVM软件生成的异常情况或强制中止.

java signal-handling

8
推荐指数
1
解决办法
1539
查看次数

无需将$ SIG {CHLD}设置为IGNORE或自定义信号处理程序即可收获子项

我正在尝试编写一个为每个连接分叉的套接字服务器.除了一个小警告之外我一直很成功:我的子进程使用Net:OpenSSH-> capture2(),这要求$ SIG {CHLD}不能设置为IGNORE或自定义信号处理程序.如何在没有设置信号处理程序的情况下收获我的孩子,或者使用wait或waitpid减慢父进程的速度?

这是我的服务器代码:

my $sock = new IO::Socket::INET (
    LocalHost   =>  'localhost',
    LocalPort   =>  '1337',
    Proto       =>  'tcp',
    Listen      =>  SOMAXCONN,
    Reuse       =>  1,
); 
die "Could not create socket: $!\n" unless $sock;

my $new_client, $pid;

while($new_client = $sock->accept()){

    next if $pid = fork;
    die "fork: $!" unless defined $pid;

    close $sock;

    while(<$new_client> ) {
        #do Net::OpenSSH stuff
    }

    exit;

} continue {
    close $new_client;
}
Run Code Online (Sandbox Code Playgroud)

如果我使用上面显示的代码,一切正常,但我最终得到了一堆僵尸进程.如果我加

local $SIG{CHLD} = 'IGNORE';
Run Code Online (Sandbox Code Playgroud)

僵尸被收获,但Net :: OpenSSH-> capture2()方法调用有一个混乱的返回代码.我假设我的信号处理程序干扰了Net :: OpenSSH需要正常工作的一些自定义处理程序?

perl parent-child signal-handling

7
推荐指数
2
解决办法
4234
查看次数

各种$ SIG {CHLD}值之间有什么区别?

这些设置有什么区别?

$SIG{CHLD} = 'IGNORE'  
$SIG{CHLD} = 'DEFAULT'  
$SIG{CHLD} = ''  
$SIG{CHLD} = undef
Run Code Online (Sandbox Code Playgroud)

根据"UNIX环境中的高级编程,第2版",图10.1 SIGCHLD的默认值是"忽略".

如果"忽略"意味着"SIG_IGN",那么任何孩子都不会成为僵尸,事实并非如此.

从那里开始并没有那么清楚:

如果进程专门将其处置设置为SIG_IGN,则调用进程的子进程将不会生成僵尸进程.请注意,这与其默认操作(SIG_DFL)不同,后者将忽略图10.1中的操作.相反,在终止时,将丢弃这些子进程的状态.

我很难知道各种值(或未定义的非值)的影响是什么.到目前为止,解决方案一直是旋转这些选择,直到我得到所需的行为,而我更确切地了解每个值如何定义信号的行为.

行为:子进程调用"system"或使用反引号创建另一个子进程,并且信号通常会被错误的(父)处理程序捕获.设置本地处理程序可以工作,但如果我希望来自祖母的信号什么都不做,我不明白哪个值最合适.

有人可以照亮我吗?

更新: 根据ikegami的反馈,我做了一些具体的测试.该行为至少部分是特定于平台的.

请考虑以下片段:

$SIG{CHLD} = sub {
    while( ( my $child = waitpid( -1, &WNOHANG ) ) > 0 ) {
        print "SIGNAL CHLD $child\n";
    }
};

my $pid = fork();

if( ! $pid ) {
    system( 'echo Grandchild PID = $$' );
    sleep 2;
    exit;
}

print "Child PID = $pid\n";
sleep 5;
Run Code Online (Sandbox Code Playgroud)

Solaris 10上的Perl 5.8.6将显示system()调用的PID的"SIGNAL CHLD"消息.做任何事情,即使是微不足道的

当地$ …

unix perl signals signal-handling sigchld

7
推荐指数
2
解决办法
1万
查看次数

叉后调用信号

"代码清单1"和"代码清单2"之间有什么区别吗?因为在代码清单1中,子进程能够捕获SIGTERM信号并很好地退出.但是代码列表2在SIGTERM信号上突然终止.

我正在使用Linux和C.

代码清单1

if (signal(SIGTERM, stopChild) == SIG_ERR) {
    printf("Could not attach signal handler\n");
    return EXIT_FAILURE;
}
pid = fork();
Run Code Online (Sandbox Code Playgroud)

代码清单2

pid = fork();
if (signal(SIGTERM, stopChild) == SIG_ERR) {
    printf("Could not attach signal handler\n");
    return EXIT_FAILURE;
}
Run Code Online (Sandbox Code Playgroud)

奇怪的是,在代码清单2中,子进程和父进程都为SIGTERM设置了信号处理程序.所以,这应该是有效的.不是吗?

c linux fork signals signal-handling

6
推荐指数
1
解决办法
7118
查看次数

在linux中执行信号处理程序是不可抢占的?

我有一个p注册了信号处理程序的进程SIGALRM.设置定时器以周期性地发送信号SIGALRM进行处理p.还有多个线程在运行p.信号处理程序在被触发和执行时是否是不可抢占的?或者说,是否信号处理程序的执行不会被进程中的任何线程中断p

PS:我认为信号处理程序是在内核中执行的(是吗?)而内核对于用户模式线程是不受限制的?纠正我,如果它错了......

multithreading operating-system signal-handling

6
推荐指数
2
解决办法
4341
查看次数

Python:Django:信号处理程序和主线程

我正在构建一个django应用程序,它依赖于一个已实现SIGINT信号处理程序的python模块.

假设我无法更改我依赖的模块,我如何解决"信号仅在主线程中工作"错误我将其集成到Django中?

我可以在Django主线程上运行它吗?有没有办法禁止处理程序允许模块在非主线程上运行?

谢谢!

python django multithreading signal-handling

6
推荐指数
2
解决办法
6113
查看次数

信号处理pika/python

pika.BlockingConnection在消费者中使用,为每条消息执行一些任务.我还添加了信号处理功能,以便消费者在完成所有任务后正常死亡.

在处理消息并收到信号时,我只是"signal received"从函数中获取,但代码不会退出.所以,我决定检查在回调函数结束时收到的信号.问题是,我检查信号的次数是多少,因为此代码中还有更多的功能.是否有更好的处理信号的方法而不会过度使用东西?

import signal
import sys
import pika
from time import sleep

received_signal = False
all_over = False

def signal_handler(signal, frame):
    global received_signal
    print "signal received"
    received_signal = True

signal.signal(signal.SIGINT, signal_handler)
signal.signal(signal.SIGTERM, signal_handler)

mq_connection = pika.BlockingConnection(pika.ConnectionParameters(my_mq_server, virtual_host='test'))
mq_channel = mq_connection.channel()

def callback(ch, method, properties, body):
    if received_signal:
        print "Exiting, as a kill signal is already received"
        exit(0)
    print body
    sleep(50)
    mq_channel.basic_ack(delivery_tag=method.delivery_tag)
    print "Message consumption complete"

    if received_signal:
        print "Exiting, as a kill signal is already …
Run Code Online (Sandbox Code Playgroud)

python signals signal-handling pika

6
推荐指数
1
解决办法
1378
查看次数

从信号处理程序唤醒线程

我理解唯一的事情,ISO/C++ 11中允许的信号处理程序是读取或写入一个无锁的原子变量或者volatile sig_atomic_t(我相信,POSIX有点更宽松,允许调用一堆系统函数).

我想知道,如果有任何办法,唤醒正在等待条件变量的线程.就像这样:

#include <mutex>
#include <atomic>
#include <condition_variable>


std::mutex mux;
std::condition_variable cv;

std::atomic_bool doWait{ true };

void signalHandler(int){
    doWait = false;
    cv.notify_one();
}

int main() {
    //register signal handler
    //Do some stuff

    {//wait until signal arrived
        std::unique_lock<std::mutex> ul(mux);
        cv.wait(ul, []{return !doWait; });
    }

    //Do some more stuff
}
Run Code Online (Sandbox Code Playgroud)

其中至少有两个问题:

  1. 我相信,我不允许打电话notify_one()给信号处理程序(如果我错了,请告诉我)
  2. 信号可以在检查doWait和线程进入休眠之间到达,因此它永远不会被唤醒(显然,我无法锁定signalHander中的互斥锁以避免这种情况).

到目前为止,我能看到的唯一解决方案是在doWait变量上实现忙等待(可能在每次迭代中休眠几毫秒),这让我觉得非常低效.

请注意,即使我上面的程序只有一个线程,我用多线程标记了我的问题,因为它是关于线程控制原语.如果标准c ++中没有解决方案,我愿意接受使用Linux/POSIX特定功能的解决方案.

c++ linux multithreading signals signal-handling

6
推荐指数
1
解决办法
2178
查看次数