第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

從交互式 go cli 中終止 shell pipe

從交互式 go cli 中終止 shell pipe

Go
眼眸繁星 2022-08-01 10:53:21
我有一個Go程序,它使用來自shell管道的“實時”輸入,例如:tail -f some/file | my-programmy-program是一個用 rivo/tview 構(gòu)建的交互式程序。我希望能夠使用Ctrl-C關(guān)閉我的程序,并讓它也終止為其提供輸入的。tail -f目前,我必須按Ctrl-C兩次才能返回到我的shell提示符。我可以通過點擊Ctrl-C一次回到我的提示嗎?
查看完整描述

1 回答

?
溫溫醬

TA貢獻1752條經(jīng)驗 獲得超4個贊

我們將假設(shè)一個類Unix系統(tǒng),使用一個理解并參與工作控制的shell(他們現(xiàn)在都這樣做了)。運行命令時,shell 會創(chuàng)建一個稱為進程組或“pgroup”的東西來保存組成該命令的每個進程。如果命令是一個管道(就像這個一樣),則管道中的每個進程都會獲得相同的 pgroup-ID(請參閱 setpgid)。

如果命令在 forgeground 中運行(不帶 ),則控制終端會分配此特定 pgid。按下其中一個信號生成鍵,例如或,使用內(nèi)部 killpg 或等效項將相應(yīng)的信號(在這些情況下)發(fā)送到 p 組。這會將信號發(fā)送到 p 組的每個成員。&CTRL-CCTRL-\SIGINTSIGQUIT

(后臺處理進程只是*咳嗽*,收回控制tty上的pgid,然后重新啟動管道中的進程。但是,實現(xiàn)這一目標并不是那么簡單,正如此處的“重新啟動”所示。

這里問題的可能根源是,交互式程序將控制終端置于cbreak原始模式,并禁用來自鍵盤鍵的部分或全部信號,例如,不再導(dǎo)致內(nèi)核的tty模塊發(fā)送信號。相反,如果您看到一個密鑰應(yīng)導(dǎo)致掛起 () 或終止,則程序必須執(zhí)行自己的掛起或終止。程序員有時認為這包括簡單地掛起或終止 - 但是由于整個管道從未獲得有問題的信號,因此情況并非如此,除非整個shell管道僅由交互式程序組成。CTRL-CCTRL-Z

解決方法是讓程序在對控制終端進行任何必要的清理(臨時或永久)后將信號發(fā)送到自己的p組。


查看完整回答
反對 回復(fù) 2022-08-01
  • 1 回答
  • 0 關(guān)注
  • 136 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號