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
一样,拿出带加号的进程