Linux   发布时间:2022-04-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了linux – 为什么需要POSIX :: SigSet?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

!/usr/bin/env perl use POSIX; my $sig_set = POSIX::SigSet->new(POSIX::SIGint); my $sig_act = POSIX::SigAction->new(sub { print "called\n"; exit 0 },$sig_set); POSIX::sigaction(SIGINT,$sig_act); sle
!/usr/bin/env perl
use POSIX;

my $sig_set = POSIX::SigSet->new(POSIX::SIGint);
my $sig_act = POSIX::SigAction->new(sub { print "called\n"; exit 0 },$sig_set);

POSIX::sigaction(SIGINT,$sig_act);

sleep(15);

如果我已经告诉POSIX :: sigaction我想要SIGINT,为什么我需要使用POSIX :: SigSet?

基本上我正在尝试用我的coderef来响应我添加到SigSet的每个信号,看看POSIX :: sigaction签名,它必须接受一个信号作为第一个参数,如果我已经告诉POSIX,这似乎是不合理的: :关于我的POSIX :: SigSet的SigAction.

我确定我在这里遗漏了一些东西.

谢谢,

解决方法

你的问题的答案

POSIX :: SigSet指定在执行信号处理程序子期间屏蔽(忽略)的其他信号.它对应于传递给C version of sigaction的底层结构的sa_mask成员.

现在,除非您通过SA_NODEFER明确请求,否则认情况下将屏蔽SIGINT(以及sigaction的第一个参数).

更好的方法

但是,如果你只想注册一个信号处理程序,它的执行不会被注册的信号中断(例如,在SIGINT处理程序中不允许SIGint),你可以完全跳过POSIX模块:

$SIG{INT} = sub { print "called\n"; exit 0; };  # Won't bE interrupted by SIGINT

在可能的情况下,Perl的信号调度模拟了在处理程序执行期间阻塞信号的传统UNIX语义. (在Linux上,它肯定可以.sigprOCMask()在执行处理程序之前被调用,然后注册作用域保护功能以在用户提供的子句末尾重新允许该信号.)

大佬总结

以上是大佬教程为你收集整理的linux – 为什么需要POSIX :: SigSet?全部内容,希望文章能够帮你解决linux – 为什么需要POSIX :: SigSet?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。