<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
Process.kill(signal, pid, ...) → integer
Process.kill
傳送指定的訊號給一個或多個程序或行程群組:
pid>0
,表示傳送訊號給指定PID的程序pid=0
,表示傳送訊號給呼叫kill的程序所在行程群組的所有程序pid<0
,表示按照作業系統的規則傳送訊號。對於Linux來說:pid=-1
,表示傳送訊號給除pid=1的init程序外的所有程序,當然,沒有許可權的程序將不受影響pid<-1
,表示傳送訊號給-pid
所在行程群組的所有程序,例如-3000
表示傳送訊號給pid=3000的程序所在行程群組的所有程序Process.kill
的第一個引數是要傳送的訊號:
-2
或-INT
),表示傳送訊號給程序所在行程群組而非指定的程序(Linux不支援帶負號的訊號)pid = fork do sleep 300 end # ... Process.kill("HUP", pid) Process.wait
Ruby中使用Kernel.trap
或Signal.trap
捕獲訊號並設定訊號處理程式,這兩個trap等價。
可設定多個trap來監控多個訊號。
Signal.trap(0, proc { puts "Terminating: #{$$}" }) Signal.trap("CLD") { puts "Child died" } fork && Process.wait =begin Terminating: 27461 Child died Terminating: 27460 =end
trap的第一個引數是監控的訊號名稱,可以是字串的訊號名稱(如SIGINT),可以是省略SIG字首的訊號名稱(如INT),可以是訊號對應的數值(如2)。
Ruby支援一個特殊的訊號0(對應的字串訊號名為EXIT或SIGEXIT),表示程序退出時會觸發的訊號。
trap的第二個引數或語句塊是捕獲到訊號後執行的程式碼。第二個引數有幾種特殊情況:
IGNORE
或SIG_IGN
,表示忽略本次捕獲的訊號DEFAULT
或SIG_DFL
,表示按照Ruby的預設處理規則來處理EXIT
,表示以退出狀態碼0退出當前程序SYSTEM_DEFAULT
,表示按照系統的預設訊號處理規則來處理,即以退出狀態碼141退出程序使用第三方包的時候,有時候不知道這個包是否定義了某個訊號的訊號處理程式,或者知道它定義了某訊號訊號處理程式,但自己定義這個訊號的訊號處理程式時,不想覆蓋第三方包中所定義的處理程式。
這時,應該利用好trap的返回值。每一次trap設定訊號處理程式時,都返回本訊號之前已經定義的訊號處理程式(是一個Proc物件)。只是需要注意,有些訊號的初始處理程式是一個字串值DEFAULT
而不是一個Proc物件,因此,應該進行型別判斷:
# 第一次定義INT的訊號處理程式 first_trap = trap('INT') { first_trap.call if first_trap.is_a? Proc puts "first_trap" } # 第二次定義INT的訊號處理程式 old_trap = trap('INT') { old_trap.call if old_trap.is_a? Proc # 呼叫第一次定義的訊號處理程式 puts "old trap" # 本次trap時執行的邏輯 } # 定義好之後,old_trap為第一次定義的訊號處理程式 # 之後按下CTRL+C觸發INT訊號的訊號處理程式
如果是在多執行緒中註冊訊號處理程式,該訊號處理程式將總是註冊在所在程序的main執行緒中(即使是在其它執行緒中設定trap()
)。
pid = fork do puts "main Thread: #{Thread.current}" Thread.new { puts "new Thread: #{Thread.current}" trap("TERM", proc { puts "Signal: #{Thread.current}" }) sleep 2 } sleep 2 end sleep 1 Process.kill 'SIGTERM', pid =begin main Thread: #<Thread:0x00007fffd6ed4c10 run> new Thread: #<Thread:0x00007fffd714f2b0@a.rb:4 run> Signal: #<Thread:0x00007fffd6ed4c10 run> =end
子程序會從父程序繼承訊號處理程式。
trap 'TERM', proc { puts "Signal: #{Process.pid}" } puts "Parent: #{Process.pid}" pid = fork do sleep 30 end puts "Child: #{pid}" Process.kill 'TERM', pid =begin Parent: 2872 Child: 2901 Signal: 2901 =end
更多關於Ruby訊號處理的知識請檢視下面的相關連結
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45