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

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

從交互式 go cli 中終止 shell 管道

從交互式 go cli 中終止 shell 管道

Go
拉丁的傳說(shuō) 2022-07-25 11:09:05
我有一個(gè) Go 程序,它使用來(lái)自 shell 管道的“實(shí)時(shí)”輸入,例如:tail -f some/file | my-programmy-program是一個(gè)用rivo/tview. 我希望能夠使用 Ctrl-C 關(guān)閉我的程序并讓它也終止向tail -f它提供輸入的程序。目前我必須按兩次Ctrl-C才能回到我的 shell 提示符。有什么方法可以通過(guò)按一次Ctrl-C 回到提示符?根據(jù)@torek 對(duì)進(jìn)度組的解釋和觀察unix.Getpgid(pid)調(diào)整了我的程序,我可以使用以下方法獲取進(jìn)度組 ID :import (  "os"  "golang.org/x/sys/unix")func main() {  // do stuff with piped input  pid := os.Getpid()  pgid, err := unix.Getpgid(pid)  if err != nil {    log.Fatalf("could not get process group id for pid: %v\n", pid)  }  processGroup, err := os.FindProcess(pgid)  if err != nil {    log.Fatalf("could not find process for pid: %v\n", pgid)  }  processGroup.Signal(os.Interrupt)}這從我原來(lái)的問(wèn)題中提供了我想要的行為。syscall由于發(fā)現(xiàn)警告,我選擇不使用:已棄用:此軟件包已鎖定。調(diào)用者應(yīng)該使用 golang.org/x/sys 存儲(chǔ)庫(kù)中的相應(yīng)包。這也是應(yīng)該應(yīng)用新系統(tǒng)或版本所需的更新的地方。有關(guān)更多信息,請(qǐng)參閱https://golang.org/s/go1.4-syscall。我計(jì)劃更新我的程序以使用本文中概述的策略來(lái)檢測(cè)它是否被賦予了管道,因此當(dāng)檢測(cè)到管道時(shí),我將在中斷時(shí)執(zhí)行上述進(jìn)程組信號(hào)。有什么問(wèn)題嗎?
查看完整描述

1 回答

?
桃花長(zhǎng)相依

TA貢獻(xiàn)1860條經(jīng)驗(yàn) 獲得超8個(gè)贊

我們將假設(shè)一個(gè)類 Unix 系統(tǒng),使用一個(gè)理解并參與作業(yè)控制的 shell (現(xiàn)在他們都這樣做了)。當(dāng)您運(yùn)行命令時(shí),shell 會(huì)創(chuàng)建一個(gè)稱為進(jìn)程組或“pgroup”的東西來(lái)保存構(gòu)成命令的每個(gè)進(jìn)程。如果命令是管道(就像這個(gè)一樣),管道中的每個(gè)進(jìn)程都會(huì)獲得相同的 pgroup-ID(請(qǐng)參閱 參考資料setpgid)。

如果命令在前臺(tái)運(yùn)行(不帶&),則控制終端會(huì)分配給它這個(gè)特定的 pgid。按下信號(hào)生成鍵之一,例如CTRL-CCTRL-\,將相應(yīng)的信號(hào)(SIGINTSIGQUIT在這些情況下)發(fā)送到 pgroup,使用內(nèi)部killpg或等效。這會(huì)將信號(hào)發(fā)送給 pgroup 的每個(gè)成員。

(后臺(tái)進(jìn)程只是簡(jiǎn)單地*咳嗽*收回控制 tty 上的 pgid,然后重新啟動(dòng)管道中的進(jìn)程。但是,要做到這一點(diǎn)并不那么簡(jiǎn)單,正如這里的“重新啟動(dòng)”所示。)

這里問(wèn)題的可能來(lái)源是交互式程序會(huì)將控制終端置于cbreakraw模式并禁用來(lái)自鍵盤鍵的部分或全部信號(hào),這樣,例如,CTRL-C不再導(dǎo)致內(nèi)核的 tty 模塊在全部。相反,如果您看到應(yīng)該導(dǎo)致暫停 ( CTRL-Z) 或終止的鍵,則程序必須執(zhí)行自己的暫?;蚪K止。程序員有時(shí)認(rèn)為這只是暫?;蚪K止——但由于整個(gè)管道從未收到有問(wèn)題的信號(hào),所以情況并非如此,除非整個(gè) shell 管道僅由交互式程序組成。

解決方法是讓程序在對(duì)控制終端進(jìn)行任何必要的清理(臨時(shí)或永久)之后將信號(hào)發(fā)送到它自己的 pgroup。


查看完整回答
反對(duì) 回復(fù) 2022-07-25
  • 1 回答
  • 0 關(guān)注
  • 117 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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