2013-02-15 39 views
3

2個問題:編程檢查某個進程在後臺中運行

1)是否有任何Linux/POSIX的API知道,如果一個過程已經調用作爲後臺進程?

linux> myprogram & 

myprogram的代碼可以檢測到它已被調用在後臺(通過&)運行?

2)是否有任何Linux/Posix API使進程在後臺運行,即使它已經作爲前臺進程啓動? I.E.在運行時以某種方式「脫離」shell(或者完全脫離shell,或者作爲shell的後臺進程運行)。

linux> myprogram 
**** starting myprogram as a background job **** 
linux> 

的shell提示應該馬上就回來給我,因爲myprogram已經從外殼脫離,並在後臺

+0

您可以檢查'top'命令的代碼,並查看它如何獲取命令名稱和進程狀態(可能涉及從'/ proc'讀取文件)。 – 2013-02-15 12:03:40

回答

2

1)有兩種方法可以知道在背景

  1. 進程是否有一個信號處理程序SIGTTIN /SIGTTOUT和做非阻塞讀/寫,這取決於信號的處理程序(標準輸入/標準輸出)。

  2. 檢查過程組和與之相匹配的終端getpgrp() == tcgetpgrp(STDOUT_FILENO)

你需要重複檢查,因爲過程可以前景化或隨時轉到後臺運行。

2)有一個daemon函數來將進程置於後臺。建議在daemonizing的同時將應用程序打印到syslog或其他文件。

if (daemonize) { 
//redirect all prints to syslog or some other logfile 
    daemon(0, 0); 
} 

其中daemonize可以是arguement該應用是否進入背景或沒有。

2

要回答你的第二部分運行,這通常被稱爲守護進程,他們正在建造的東西喜歡這個。

main() 
    pid = fork() 
    if pid is child 
      run program 
    else we are the parent process 
     exit to command prompt 
1

如果其父進程沒有掛起(等待),並且您可以通過PID檢查,則該進程位於後臺。

要在後臺放置一個進程(在運行時將其從shell中完全分離),可以使用守護進程(3)函數。

0

您可能想要閱讀tty(4)手冊頁。據我所知,在後臺進程沒有任何/dev/tty(所以open - 該文件將失敗)。

TIOCNOTTY ioctl應該從其控制終端分離調用進程。

您可能會被isatty(3)功能有興趣(例如檢測到您的標準輸入標準輸出是或不是終端)。