我不是英文用戶,所以可能會有一些錯誤的句子:)
我正在制作迷你殼。在代碼中,子行程運行 execvp 函式。并且父行程將子行程的 pgid 更改為與子行程的 pid 相同。
但是,更改孩子的 pgid 后,孩子開始在后臺運行,所以 minishell 不能正常作業。如果我不更改孩子的 pgid,那么它可以完美運行。
我想知道如何將后臺子行程帶到前臺,或者如何不讓子行程在后臺運行。
int execute(){
pid_t pid = fork();
if (pid == 0){
execvp(args[idx], &args[idx]);
}
else{
setpgid(pid, pid);
int status;
waitpid(pid, &status, WUNTRACED);
if (WIFSTOPPED(status))
kill(pid, SIGINT);
}
}
uj5u.com熱心網友回復:
TL;DR:用于tcsetpgrp()更改哪個行程組在相關終端的前臺。
在任何給定時間,一個終端最多有一個控制行程組。該行程組中的行程可以接收來自終端的輸入并向其寫入輸出,并且它們接收由終端驅動程式生成的某些信號以回應諸如 ctrl-C 之類的鍵擊。處于其控制終端的控制行程組中意味著行程處于前臺。
其他行程組中的行程不接收來自終端的輸入,也無法向其寫入輸出。在不同的情況下,它們將從終端驅動程式接收到與控制行程組中的行程不同的信號。這就是在后臺的意義。
執行作業控制的外殼程式,包括但不限于管理其他行程的前臺和后臺狀態,部分是通過將它產生的行程分配給適當的行程組(setpgid())并管理哪個行程,包括它自己的,是任何給定時間的前臺行程組 ( tcsetpgrp())。這比簡單地在自己的行程組中運行所有作業要復雜得多。
Glibc 手冊包含大量有關該領域的資訊,包括示例代碼。考慮閱讀Job Control一章,尤其是其實作 Job Control Shell部分。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/531349.html
標籤:Clinux壳过程信号
上一篇:Makefile:使用帶有生成內容的shell命令作為引數
下一篇:洗掉兩個雙引號后的下一個單雙引號
