我試圖做一個前臺和後臺進程的shell,如果前臺進程試圖訪問終端,它會自動停止(因爲它沒有訪問終端) 。 發生的是,起初,我把我的shell忽略的信號前臺和後臺進程的問題
SIGTSTP
SIGINT
SIGTTOU
分叉,爲前臺和後臺進程的孩子後,我將孩子放在上面回忽略信號
SIG_DFL
此外,對於每個孩子,我還設置了他們的pgids,以便他們在不同的程序組中。
我有前景和背景的過程的母體之間的區別在於,對於前景,我也給子終端訪問:
tcsetpgrp(STDIN, getpgid(getpid()))
tcsetpgrp(STDOUT, getpgid(getpid()))
此外,前臺進程的父也等待子到在循環返回並要求用戶再次提示之前完成。
爲背景的孩子,家長只是調用
continue
環回,並要求更多的用戶提示。另外,我還有一個用waitpid()行處理SIGCHLD信號的處理程序,以確保沒有後臺進程成爲殭屍。
問題: 但是,我遇到的問題是我的後臺進程仍然可以訪問終端(在後臺進程中使用echo「hello」仍然有效),而且我的前臺進程似乎忽略了生成的信號由CTL + C和CTL + Z組成,儘管我在前景兒童以及背景兒童中重新啓用了它們。 任何人都有可能錯誤的提示嗎?