By contrast, if multiple instances of a standard signal are delivered while that signal is currently blocked, then only one instance is queued.
我觉得上面的描述不是很清楚,对我造成歧义:
如果特定信号没有被阻塞,同一个信号的多个实例会被排队吗?
信号在哪里排队,进程特定位置还是全局位置?
如何处理排队的信号,是否有可能同时处理两个信号,或者保证一个一个地处理信号?
所以这里实际上是 3 个问题..
最佳答案
what if the specific signal is not blocked , will multiple instances of the same signal be queued?
这取决于是否使用sigaction 结构和sigaction() 函数为信号设置了SA_SIGINFO 标志,以及您的系统是否对_POSIX_REALTIME_SIGNALS 进行了有效定义(现代 Linux 内核可以)。如果两个实例都为真,则满足这两个条件的任何到达信号都将在每个进程队列中排队,直到它们被传递或接受到操作系统对给定信号队列中的项目数量施加的限制。在那之后,任何其他针对该信号类型到达的信号都将被丢弃。
如果其中任何一种情况不成立,则仅处理当前到达的信号,并丢弃在当前信号处理程序运行时到达的任何其他相同信号类型的信号。此外,如果您阻止信号,并且两个或更多信号到达进程但未交付,它们将合并为一个信号事件。但同样,这仅在不满足上述两个条件的情况下......否则将排队多个相同类型的信号事件。
还有一点要注意……所陈述的两个条件是针对 POSIX 规范的,但是 Linux 会将任何实时信号排队,即使没有为该信号设置 SA_SIGINFO 也是如此。因此,这意味着对应于 SIGRTMIN 和 SIGRTMAX 范围的任何信号。
Where is the signal queued,a process specific location or a global location?
它存储在每个进程的队列中。
How is the queued signals handled, will it be possible that two signals are being processed at the same time,or it's guaranteed signals will be processed one by one?
这取决于您如何使用 sigaction 结构和 sigaction() 函数设置信号处理程序。不能保证在您的信号处理程序运行时会阻止任何其他信号。可以在 sigaction 结构中设置一个信号掩码,以确定在信号处理程序运行时阻止哪些信号。信号本身会被阻塞,直到信号处理程序完成,但如果不同的信号没有被 sigaction 结构中为信号处理程序设置的信号掩码集阻塞,则它可能会中断您当前的信号处理程序。因此,您在信号处理程序中所做的任何事情都应该是异步安全的,并且您不应该在信号处理程序中调用任何非异步安全函数,例如 fprintf() 等。因此可以保证信号本身以 FIFO 顺序处理(即,信号不会自行中断),但如果您没有故意阻止其他信号,则其他信号可能会中断您当前的信号处理程序。请记住,在您的信号处理程序中设置一个信号掩码以试图阻止其他信号中断您的处理程序是一个非常糟糕的想法,并且不是原子操作,所以不要这样做.如果您希望在信号处理程序运行时阻止其他信号,请在传递给 sigaction() 的 sigaction 结构中提供信号掩码。
关于c - 关于标准信号的传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6343871/
我没有找到太多关于如何执行此操作的信息,尽管有很多关于如何使用像这样的redirect_to将参数传递给重定向的建议:action=>'something',:controller=>'something'在我的应用程序中,我在路由文件中有以下内容match'profile'=>'User#show'我的表演Action是这样的defshow@user=User.find(params[:user])@title=@user.first_nameend重定向发生在同一个用户Controller中,就像这样defregister@title="Registration"@user=Use
我正在使用RubyonRails3.0.9,我想生成一个传递一些自定义参数的link_toURL。也就是说,有一个articles_path(www.my_web_site_name.com/articles)我想生成如下内容:link_to'Samplelinktitle',...#HereIshouldimplementthecode#=>'http://www.my_web_site_name.com/articles?param1=value1¶m2=value2&...我如何编写link_to语句“alàRubyonRailsWay”以实现该目的?如果我想通过传递一些
我想使用spawn(针对多个并发子进程)在Ruby中执行一个外部进程,并将标准输出或标准错误收集到一个字符串中,其方式类似于使用Python的子进程Popen.communicate()可以完成的操作。我尝试将:out/:err重定向到一个新的StringIO对象,但这会生成一个ArgumentError,并且临时重新定义$stdxxx会混淆子进程的输出。 最佳答案 如果你不喜欢popen,这是我的方法:r,w=IO.pipepid=Process.spawn(command,:out=>w,:err=>[:child,:out])
我正在尝试找到一种方法来规范化字符串以将其作为文件名传递。到目前为止我有这个:my_string.mb_chars.normalize(:kd).gsub(/[^\x00-\x7F]/n,'').downcase.gsub(/[^a-z]/,'_')但第一个问题:-字符。我猜这个方法还有更多问题。我不控制名称,名称字符串可以有重音符、空格和特殊字符。我想删除所有这些,用相应的字母('é'=>'e')替换重音符号,并将其余的替换为'_'字符。名字是这样的:“Prélèvements-常规”“健康证”...我希望它们像一个没有空格/特殊字符的文件名:“prelevements_routin
如何在Ruby中按名称传递函数?(我使用Ruby才几个小时,所以我还在想办法。)nums=[1,2,3,4]#Thisworks,butismoreverbosethanI'dlikenums.eachdo|i|putsiend#InJS,Icouldjustdosomethinglike:#nums.forEach(console.log)#InF#,itwouldbesomethinglike:#List.iternums(printf"%A")#InRuby,IwishIcoulddosomethinglike:nums.eachputs在Ruby中能不能做到类似的简洁?我可以只
这是我的网络应用:classFront我是这样开始的(请不要建议使用Rack):Front.start!这是我的Puma配置对象,我不知道如何传递给它:require'puma/configuration'Puma::Configuration.new({log_requests:true,debug:true})说真的,怎么样? 最佳答案 配置与您运行的方式紧密相关puma服务器。运行的标准方式puma-pumaCLI命令。为了配置puma配置文件config/puma.rb或config/puma/.rb应该提供(参见examp
我有一个电子邮件表格。但是我正在制作一个测试电子邮件表单,用户可以在其中添加一个唯一的电子邮件,并让电子邮件测试将其发送到该特定电子邮件。为了简单起见,我决定让测试电子邮件通过ajax执行,并将整个内容粘贴到另一个电子邮件表单中。我不知道如何将变量从我的HAML发送到我的Controllernew.html.haml-form_tagadmin_email_blast_pathdoSubject%br=text_field_tag'subject',:class=>"mass_email_subject"%brBody%br=text_area_tag'message','',:nam
我在我的rails应用程序中安装了来自github.com的acts_as_versioned插件,但有一段代码我不完全理解,我希望有人能帮我解决这个问题class_eval我知道block内的方法(或任何它是什么)被定义为类内的实例方法,但我在插件的任何地方都找不到定义为常量的CLASS_METHODS,而且我也不确定是什么here,并且有问题的代码从lib/acts_as_versioned.rb的第199行开始。如果有人愿意告诉我这里的内幕,我将不胜感激。谢谢-C 最佳答案 这是一个异端。http://en.wikipedia
我经常迷上ruby的一件事是递归模式。例如,假设我有一个数组,它可能包含无限深度的数组作为元素。所以,例如:my_array=[1,[2,3,[4,5,[6,7]]]]我想创建一个方法,可以将数组展平为[1,2,3,4,5,6,7]。我知道.flatten可以完成这项工作,但这个问题是作为我经常遇到的递归问题的一个例子-因此我试图找到一个更可重用的解决方案。简而言之-我猜这种事情有一个标准模式,但我想不出任何特别优雅的东西。任何想法表示赞赏 最佳答案 递归是一种方法,它不依赖于语言。您在编写算法时要考虑两种情况:再次调用函数的情
我正在使用ruby标准记录器,我想要每天轮换一次,所以在我的代码中我有:Logger.new("#{$ROOT_PATH}/log/errors.log",'daily')它运行完美,但它创建了两个文件errors.log.20130217和errors.log.20130217.1。如何强制它每天只创建一个文件? 最佳答案 您的代码对于长时间运行的应用程序是正确的。发生的事情是您在给定的一天多次运行代码。第一次运行时,Ruby会创建一个日志文件“errors.log”。当日期改变时,Ruby将文件重命名为“errors.log