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一样,拿出带加号的进程
在这里插入图片描述

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