1. 程式人生 > >Linux之Makefile(併發執行命令)

Linux之Makefile(併發執行命令)

GNU make 支援同時執行多條命令。通常情況下,同一時刻只有一個命令在執行,
下一個命令只有在當前命令執行完成之後才能夠開始執行。不過可以通過 make的命令
行選項“-j”或者“--job”來告訴 make 在同一時刻可以允許多條命令同時被執行(注
意,在 MS-DOS中此選項無效,因為它是單任務作業系統)。 
如果選項“-j”之後存在一個整數,其含義是告訴 make 在同一時刻可允許同時執
行命令的數目。這個數字被稱為“job slots”。當“-j”選項之後沒有出現一個數字時,
那麼同一時刻執行的命令數目沒有要求。使用預設的“job slots” ,值為 1。表示make
將序列的執行規則的命令(同一時刻只能有一條命令被執行)。 
並行執行命令所帶來的問題是顯而易見地: 
1.  多個同時執的命令的輸出資訊將同時被輸出到終端。當出現錯誤時很難根據一
大堆凌亂的資訊來區分是哪條命令執行錯誤。 
2.  在同一時刻可能會存在多個命令執行程序同時讀取標準輸入,但是對於標準輸
入裝置來說,在同一時刻只能存在一個程序訪問它。就是說在某個時間點, make
只能保證此刻正在執行的程序中的一個程序讀取標準輸入流,而其它程序的標
準輸入流將置無效。因此在一時刻多個執行命令的程序中只能有一個程序獲得
標準輸入,而其它需要讀取標準輸入流的程序由於輸入流無效而導致致命錯誤
(通常此程序會得到作業系統的管道破裂訊號而被終止)。 
 
這是因為:執行中的命令在什麼時候會讀取標準輸入流(終端輸入或重定向的
標準輸入)是不可預測的。而得到標準輸入的順序總是按照先來先獲得的原則。
那個命令首先被執行,那麼它就可以首先得到標準輸入裝置。而其它後續需要
獲取標準輸入裝置的命令執行程序,由於不能得到標準輸入而產生致命錯誤。
在 Makefile 規則中如果存在很多命令需要讀取標準輸入裝置,而它們又被允許
並行執行時,就會出現這樣的錯誤。 
 
為了解決這個問題。我們可以修改 Makefile 規則的命令使之在執行過程中避免
使用標準輸入。當然也可以只存在一個命令在執行時會訪問標準輸入流的
Makefile。 
3.  會導致make的遞迴調用出現問題。