前台、后台、守护进程

更多资料下载,冲击月薪过万,一线经验工程师录制, 干货满满的嵌入式视频教程,请点击淘宝店:wanglitao.taobao.com

运行的进程分为前台进程和后台进程。
前台进程会绑定并占用一个终端(键盘、显示器、串口等),接受用户的输入,并将打印输出到终端。也有一些特殊的程序不需要跟用户打交道,不用跟用户进行交互,比如网站服务进程,主要用来处理HTTP请求,不需要跟当前用户进行交互,就不需要占用终端了,这个进程可以转到后台去执行,这样的进程也称为后台进程。

后台进程不需要绑定和占用终端,它独立于终端并周期性地执行某种任务(如杀毒)或等待处理某种请求(网页访问HTTP请求、SSH登录请求)。当我们运行一个命令,在命令后面加一个 &,就可以让整个程序在后台运行,整个进程也就变成了后台进程。

#include <stdio.h>
#include <unistd.h>
int main(void)
{
    while(1)
    {
        printf("hello zhaixue.cc\n");
        sleep(1);
    }
    return 0;
}

为了演示前后台进程,我们编写一个简单的C程序,如上所示,每隔1秒,循环打印字符串:hello zhaixue.cc,编译上面的程序并运行。

# gcc main.c -o a.out
# ./a.out
hello zhaixue.cc
hello zhaixue.cc
hello zhaixue.cc...

因为前台进程会绑定和占用终端,所以程序会一直讲字符串打印到屏幕,我们可以使用Ctrl+z将该进程放到后台,暂停运行。此时我们可以通过jobs命令查看后台的进程:

hello zhaixue.cc
^Z
[1] + 11578 suspended ./a.out
# jobs
[1] + suspended ./a.out

此时a.out进程就由前台进程变成了后台进程,并暂停运行。此时我们可以通过bg或fg命令,在后台运行这个进程,或者将任务放到前台执行。

# bg %1
# fg %1

其中的%1编号指的是使用jobs命令得到的后台进程索引编号。

Linux后台进程也称为守护进程(daemon),Linux的大多数服务器都是用守护进程实现的。守护进程独立于终端在后台运行,用于执行特定的任务。Linux系统在启动时,会从启动脚本/etc/rc.d中启动一些列后台服务,这些服务的名称通常是以*d结尾。

# ps -A | grep d    
  1 ?        00:00:11 systemd
  2 ?        00:00:00 kthreadd
  6 ?        00:00:00 kworker/0:0H-kblockd
 10 ?        00:00:00 ksoftirqd/0
 11 ?        00:00:18 rcu_sched
 18 ?        00:00:00 ksoftirqd/1
 24 ?        00:00:00 kauditd
 26 ?        00:00:00 khungtaskd
 30 ?        00:00:00 ksmd
 31 ?        00:00:02 khugepaged
 78 ?        00:00:00 kintegrityd
 79 ?        00:00:00 kblockd
 84 ?        00:00:00 md

TIPS:上面的a.out进程,虽然放在后台运行了,但是程序输出还是一直打印在屏幕上,智慧如你,想一想这是什么原因?

《Linux三剑客》视频教程,从零开始快速掌握Linux开发常用的工具:Git、Makefile、vim、autotools、debug,免费赠送C语言视频教程,C语言项目实战:学生成绩管理系统。详情请点击淘宝链接:Linux三剑客