当我们在Linux的终端下执行某个程序后,如果将终端关闭,那么,你之前运行的那个程序也会随着终端的关闭而结束。

在Linux中需要有这样一类程序,程序启动后,可以默默地在后台一直运行,即使我们把终端退出,之前运行的程序还是可以在服务器上保持运行的状态的。

如果说,你没遇到过这种情况,那说明你可能没使用过Linux系统,赶快行动起来吧。

Linux守护进程是一类在后台运行的特殊进程,用于执行特定的系统任务。很多守护进程在系统引导的时候启动,并且一直运行直到系统关闭。另一些只在需要的时候才启动,完成任务后就自动结束。


下面这个程序(代码来源于网络)是一个循环任务,不断的向文件中输出内容。

#include
#include
#include
#include
#include
#include
#include
#include

void main(){
    FILE *fp;
    time_t t;
    while(1)
    {
        sleep(6);
        fp=fopen("hello.log","a");
        if(fp>=0)
        {
            time(&t);
            fprintf(fp,"current time is:%s\n",asctime(localtime(&t)));
            fclose(fp);
        }
    }
    return;
}

实验环境

华为云教学实验平台(大家可以根据之前的文章,加入华为云课堂),每次打开实验平台的节点,缺省是30分钟使用期限,时间到,自动退出,因此请不要在实验平台上,保存个人资料,以免丢失!!!

30分钟使用期限!

30分钟使用期限!

30分钟使用期限!

当然可以重复打开实验。

编译运行程序

大家要熟练掌握vim的使用。

编译运行该程序

查看程序运行效果

关闭终端(Terminal程序)

终端关闭,看看进程还存在吗?

但是我们希望的是关闭终端后,程序还在后台默默的死循环。这样的进程才是守护进程。

改造程序

根据网上的资料,自行改造为一个守护进程。代码如下,供参考

#include
#include
#include
#include
#include
#include
#include
#include

void init_daemon(){
    int pid;
    int i;
    pid=fork();
    if(pid<0)
        exit(1);
    else if(pid>0)
        exit(0);
    setsid();
    pid=fork();
    if(pid>0)
        exit(0); /
    else if(pid<0)
        exit(1);
    for(i=0;i        close(i);
    chdir("/tmp");
    umask(0);
    return;
}

void main(){
    FILE *fp;
    time_t t;
    printf("pid = %d\n", getpid());
    init_daemon();
    while(1)
    {
        sleep(6);
        fp=fopen("hello2.log","a");
        if(fp>=0)
        {
            time(&t);
            fprintf(fp,"current time is:%s\n",asctime(localtime(&t)));
            fclose(fp);
        }
    }
    return;
}

运行程序,看看效果。

把刚才运行程序的终端关闭,看看效果,程序应该还在后台运行。