1.前臺和後臺
前臺: 可以控制與執行命令的這個環境稱爲前臺的任務;
後臺: 可以自動執行的任務,無法用ctrl+c
終止,可使用bg
,fg
調用該任務;
2.&符號
這個符號可以直接將任務丟到後臺執行;
int main()
{
while (1) {
}
return 0;
}
一個簡單的while
循環我們嘗試將他丟入後臺;
會出現[1] 13150
這串數字是什麼意思呢?
這裏的[1]
是一個任務號碼,下一個放入後臺的就會是[2]
以此類推;
當你重新打開一個終端時,在將一個任務放入後臺就會從[1]
開始;
我們可以從pstree
中看出一些原因:
我們可以看到運行在不同terminal
下的進程是有着不同的父進程的;
13150
就是這個進程的PID
進程號;
2.1在後臺向stderr
和stdout
輸出會顯示嗎
#include <stdio.h>
int main()
{
fprintf(stderr, "stderr\n");
fprintf(stdout, "stdout\n");
return 0;
}
我們來測試一下被放入後臺的程序還能不能向屏幕輸出;
我們這裏會發現是可以的,但是有點奇怪;
隨意我們在這種帶有輸出的命令,程序在丟入後臺執行時,可以加上重定向,將內容輸出到,別的文件中;
./a.out > 1.txt &
執行上述命令後,他就不會顯示在屏幕上了,就會顯示在文件中了;
對於在後臺中執行完的任務,在執行完以後會告訴執行者,我執行完了,但是是在,執行下一個命令時;
這裏我們可以看到,在我們執行完了cat
命令以後會告訴我們剛剛丟入後臺的程序已經執行完了;
2.2後臺執行scanf
?
後臺可以執行scanf
或者別的輸入嗎?
其實顯然是不能的…
這裏我們用事實說話
#include <stdio.h>
int main()
{
int i;
scanf("%d", &i);
printf("^^^^\n");
return 0;
}
我們發現是不可以輸入的,而且在遇到輸入時,進程會變成停止狀態;
我們可以看到a.out
這個進程狀態已經變成了T
;
3.jobs
命令
jobs
命令是用來查看目前的後臺任務狀態的;
我們以下都用下面這個程序來作爲示例:
#include <stdio.h>
int main()
{
while (1) {
}
return 0;
}
我們開三個進程,第三個用ctrl+z
停止;然後我們來看jobs
命令
jobs
jobs -l
相比jobs
多了進程號;
jobs -r
-r
只顯示正在運行的進程;
jobs -s
-s
只顯示停止的進程;
4.從後臺到前臺—fg
命令
在後臺運行或者停止的進程可以通過fg
命令拿到前臺運行,後臺正在停止的進程,拿到前臺後就變成了正在運行狀態;
我們還是要看這個圖,在第二列有一個進程前面有個+
,有一個進程有個-
;
這個加號和減號代表什麼意思呢?
這個其實在fg
這裏有用途,fg
拿出來的就是這個帶加號的進程;因爲這裏都是a.out
不太好辨認,所以我們編譯成1,2,3
;
其實這裏我們可以看出來,帶加號的進程是最近一個放入後臺的進程;
我們看到這裏把任務編號爲[3]
的進程結束以後,[2]
變成了加號;
fg 數字
就能把後臺編號爲該數字的進程拿到前臺來;
5.bg
命令
bg
命令是可以把後臺停止的任務變成在後臺運行;和fg
一樣,拿出帶加號的進程