簡體   English   中英

終端訪問控制問題

[英]Terminal Access Control issues

我正在嘗試編寫一個shell。 運行前台進程時,分叉進程管道將獲得其自己的進程組標識。 然后終端被賦予該進程組id(使用tcsetpgrp),並且shell在再次給自己終端控制之前等待它終止。 這完全沒問題。

出現的問題是當我嘗試運行后台進程時。 同樣,我給管道中的所有進程提供了一個進程組ID,但這次我沒有給該組提供終端控制。 在運行時,給定后台命令的輸出被輸出到終端(在它完成執行之前)並且終端同時向用戶提供提示。 應該發生的是,嘗試寫入終端的子進程應該得到一個SIGTTOU並且它應該停止,但這顯然不會發生。 我驗證了分叉進程都具有相同的進程組ID,並且此id與shell的不同。

在退出shell(通過ctrl-c)並返回到運行它的標准bash shell時,因為我在shell終止時沒有收到后台進程,后台進程繼續運行(除外)。 但奇怪的是,這個過程繼續將輸出寫入bash shell,即使它不是前台進程。 這使我得出結論,由於POSIX錯誤(不太可能),這個后台進程沒有得到任何SIGTTOU,它正在處理它們(導致停止的默認操作被忽略),或者后台進程忽略了SIGTTOU。

有沒有辦法在執行分叉進程之前確保它在收到SIGTTOU時停止(假設exec二進制文件沒有改變任何東西)?

SIGTTOU被發送到后台進程,該進程僅在為該終端設置了termios標志TOSTOP時才嘗試寫入終端。 默認情況下,通常不設置,在這種情況下,后台進程可以愉快地寫入終端。 TOSTOP標志不會影響讀取權限。如果進程嘗試讀取,則會發送一個SIGTTIN 。)

所以,是的,前台進程可以做一些事情:使用tcsetattr來設置TOSTOP

解決方案是在調用exec之前使forked進程執行以下命令:

struct termios term; 
if (tcgetattr(STDIN_FILENO, &term) < 0)
        printf("ERROR\n");
    term.c_lflag = TOSTOP;
    if (tcsetattr(STDIN_FILENO,TCSANOW,&term)<0)
        printf("ERROR\n");

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM