2011-10-10 79 views
1

我試圖做一個前臺和後臺進程的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組成,儘管我在前景兒童以及背景兒童中重新啓用了它們。 任何人都有可能錯誤的提示嗎?

回答

0

「正常」的shell工作不同,前臺進程不是孩子。如果需要的話

  • 叉後臺進程,然後在子集的信號,關閉所有繼承文件描述符,setprgp(從控制tty分離),打開文件的I/O重定向:因此,我會做這樣的

  • ,決定是否要等待子進程或不理會他們(SIG_CHLD)