Linux下任務管理的命令

1.前臺和後臺

前臺: 可以控制與執行命令的這個環境稱爲前臺的任務;
後臺: 可以自動執行的任務,無法用ctrl+c終止,可使用bg,fg調用該任務;


2.&符號

這個符號可以直接將任務丟到後臺執行;

int main()
{
    while (1) {
    
    }

    return 0;
}

一個簡單的while循環我們嘗試將他丟入後臺;
在這裏插入圖片描述
會出現[1] 13150這串數字是什麼意思呢?
這裏的[1]是一個任務號碼,下一個放入後臺的就會是[2]以此類推;
當你重新打開一個終端時,在將一個任務放入後臺就會從[1]開始;
我們可以從pstree中看出一些原因:
在這裏插入圖片描述
我們可以看到運行在不同terminal下的進程是有着不同的父進程的;
13150就是這個進程的PID進程號;

2.1在後臺向stderrstdout輸出會顯示嗎

#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一樣,拿出帶加號的進程
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章