2009-09-21 95 views
4

在C中,檢測程序的方式是在「後臺模式」中調用的? 我有一個程序,我想要以交互方式或在後臺啓動。檢測後臺操作

如何檢測我不應該從標準輸入讀取並以「Stopped:tty input」狀態結束?

我應該測試stdin是否關閉?我怎樣才能做到這一點 ?

編輯: isatty似乎是一個好主意,但是如果stdin是管道末端而不是tty,會發生什麼?

回答

3

使用上控制終端的文件描述符tcgetpgrp()功能(例如STDIN_FILENO或0爲stdin)檢查當前前臺進程組是否等於您自己的進程組(從getpgrp())。但是,隨着程序在前景和背景之間移動,前景處理組可能會隨時更改。例如,在您撥打tcgetpgrp()之後並在測試之前,它可能會立即更改。因此,如果你打算根據此採取任何行動,請記住這一點;它不是避免SIGTTIN的可靠方法。

#include <unistd.h> 
pid_t fg = tcgetpgrp(STDIN_FILENO); 
if (fg == -1) { 
    /* stdin is not controlling terminal (e.g. file, pipe, etc.) */ 
} else if (fg == getpgrp()) { 
    /* foreground */ 
} else { 
    /* background */ 
} 
1

1)你應該檢查標準輸入是否打開,並打開/ dev/null,如果它關閉。

2)可以使用isatty其中「返回1,如果遞減是連接到終端和0打開文件描述符否則」