亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫(kù)
12
最近訪問板塊 發(fā)新帖
樓主: homerzhou
打印 上一主題 下一主題

[系統(tǒng)管理] 關(guān)于這個(gè)shell為什么沒有停止 [復(fù)制鏈接]

論壇徽章:
0
11 [報(bào)告]
發(fā)表于 2015-10-30 00:18 |只看該作者
找到一篇文章講解的不錯(cuò):
https://  blog.robotshell.org/2012/necessary-details-about-signal-trap-in-shell

他也提到了樓主說(shuō)的文檔:
http://  mywiki.wooledge.org/SignalTrap

梳理下原因:

1、
Bash 等終端的默認(rèn)行為是這樣的:當(dāng)按下 CTRL-C 之后,它會(huì)向當(dāng)前的整個(gè)進(jìn)程組發(fā)出 SIGINT 信號(hào)。而 sleep 是由當(dāng)前腳本調(diào)用的,是這個(gè)腳本的子進(jìn)程,默認(rèn)是在同一個(gè)進(jìn)程組的,所以也會(huì)收到 SIGINT 并停止執(zhí)行


2、
這篇文檔給了我們一個(gè)更準(zhǔn)確的說(shuō)明——如果當(dāng)前正有一個(gè)外部命令在前臺(tái)執(zhí)行,那么 trap 會(huì)等待當(dāng)前命令結(jié)束以后再處理信號(hào)隊(duì)列中的信號(hào)。


3、
On most operating systems, ping is an example of a misbehaving process. It traps SIGINT in order to display a summary at the end, before exiting. But it fails to kill itself with SIGINT, and so the calling shell does not know that it should abort as well


這個(gè)問題挺有趣兒的,學(xué)習(xí)了。

論壇徽章:
0
12 [報(bào)告]
發(fā)表于 2015-10-30 10:54 |只看該作者
本帖最后由 homerzhou 于 2015-10-30 10:56 編輯

還是有一個(gè)小的疑惑,那篇文檔中提到  “如果當(dāng)前正有一個(gè)外部命令在前臺(tái)執(zhí)行,那么 trap 會(huì)等待當(dāng)前命令結(jié)束以后再處理信號(hào)隊(duì)列中的信號(hào)!  ,不管怎么樣./test.sh 還是會(huì)收到SIGINT的信號(hào),即使需要等到ping結(jié)束之后,那為什么這個(gè)時(shí)候收到SIGINT信號(hào)就沒有停止呢,
“But it fails to kill itself with SIGINT, and so the calling shell does not know that it should abort as well”
我是這么理解這句話的意思的,當(dāng)按ctrl +c 時(shí),如果子進(jìn)程ping沒有因?yàn)镾IGINT信號(hào)退出,那么./test.sh不知道子進(jìn)程ping是由于SIGINT退出的,它認(rèn)為ping是正常退出的,這時(shí)./test.sh對(duì)SIGINT就會(huì)是默認(rèn)不處理,不知道這么理解對(duì)不對(duì),要是確實(shí)是這樣的話,有鏈接可以共享嗎?
回復(fù) 11# sncchen


   

論壇徽章:
84
每日論壇發(fā)貼之星
日期:2015-12-29 06:20:00每日論壇發(fā)貼之星
日期:2016-01-16 06:20:00每周論壇發(fā)貼之星
日期:2016-01-17 22:22:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2016-01-20 06:20:00每日論壇發(fā)貼之星
日期:2016-01-20 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2016-01-21 06:20:00每日論壇發(fā)貼之星
日期:2016-01-21 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2016-01-23 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2016-01-31 06:20:00數(shù)據(jù)庫(kù)技術(shù)版塊每日發(fā)帖之星
日期:2016-01-16 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2016-01-16 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2016-01-14 06:20:00
13 [報(bào)告]
發(fā)表于 2015-10-30 15:05 |只看該作者
本帖最后由 yjh777 于 2015-10-30 15:07 編輯

我知道原因了,bash的 SIGINT 處理邏輯如下:
    判斷是否還有活著的子進(jìn)程,如果沒有了就退出,如果還有就忽略;

ping的特殊性在于,它收到信號(hào)后,先做一些需要一定時(shí)間的操作 然后再退出
    如果這個(gè)退出在bash處理SIGINT之前,bash就不會(huì)退出。


下面是我寫的一個(gè)用于測(cè)試的例子,三種情況:
    1) 如果把 sub.sh 里面那個(gè)usleep 時(shí)間設(shè)置的足夠長(zhǎng),shell就永遠(yuǎn)不會(huì)退出
    2) 如果把 usleep 和 上面的echo去掉,快速按幾次Ctr+C 就可以讓shell退出,因?yàn)楦缸舆M(jìn)程處理SIGINT的耗時(shí)相當(dāng)
    3) 如果sub.sh不去trap SIGINT的話,系統(tǒng)默認(rèn)的SIGINT處理是最快的,
          所以子進(jìn)程總是在shell處理SIGINT時(shí)就死光了,所以shell就一次Ctr+C 就保證退出了
  1. jiyin@dhcp-12-137:~$ cat kkk.sh

  2. while :; do
  3.                 ./sub.sh
  4. done
  5. jiyin@dhcp-12-137:~$ cat sub.sh

  6. sigproc() {
  7.         echo "$@" >>sig.log
  8.         usleep 100000
  9.         exit
  10. }

  11. >sig.log
  12. trap sigproc SIGINT SIGTERM

  13. echo "I am a sub process of kkk.sh $"
  14. sleep 10
復(fù)制代碼
@homerzhou

論壇徽章:
0
14 [報(bào)告]
發(fā)表于 2015-11-02 09:38 |只看該作者
有道理!回復(fù) 13# yjh777


   

論壇徽章:
0
15 [報(bào)告]
發(fā)表于 2015-11-02 18:18 |只看該作者

主要是因?yàn)閎ash 腳本作為父進(jìn)程處于waitpid時(shí),會(huì)檢查子進(jìn)程是如何退出的。 如果是調(diào)用exit退出的, 父進(jìn)程不退出,bash 腳本繼續(xù)運(yùn)行。 如果是因?yàn)槭盏絊IGINT信號(hào)后做默認(rèn)處理退出的(也就是不捕獲該信號(hào)),父進(jìn)程退出,bash 腳本終止執(zhí)行。

ping代碼中捕獲了SIGINT信號(hào),并安裝了信號(hào)處理函數(shù), 該信號(hào)處理函數(shù)打印統(tǒng)計(jì)信息, 然后正常返回,ping隨后也正常退出了。 bash發(fā)現(xiàn)子進(jìn)程退出,但是不是因?yàn)镾IGINT默認(rèn)處理退出的,所以 父進(jìn)程并不退出, 而是繼續(xù)執(zhí)行。
12
返回列表 發(fā)新帖
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP