孤儿/僵尸/守护进程

孤儿进程被init领养,无害。
僵尸进程占用pcb,没有被父进程的wait或者是waitpid回收,有害。

上面两个概念我比较熟悉。

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

下面这段程序每隔6秒钟就向hello.log中写入一段数据……我们可以使用./test &让程序一直在后台运行,但是一旦关闭当前终端,进程就不会继续运行下去,所以这并不是一个在没有终端的情况下也能运行的守护进程……

#include<unistd.h>
#include<signal.h>
#include<stdio.h>
#include<stdlib.h>
#include<sys/param.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<time.h>

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;
}

改造一下上面的程序……让它成为守护进程……

#include<unistd.h>
#include<signal.h>
#include<stdio.h>
#include<stdlib.h>
#include<sys/param.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<time.h>

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<NOFILE;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;
}

改造之后的结果,启动程序之后会一直的在后台运行,即使终端关闭……

hello2.log是在/tmp文件夹下……

图片说明

1、守护进程是一个孤儿进程,它的父进程是init;2、守护进程与任何终端无关。

全部评论

相关推荐

不愿透露姓名的神秘牛友
06-27 20:55
点赞 评论 收藏
分享
是每个人事都这样与找工作的人这样沟通吗?正常询问不可以吗
据说名字越长别人越关注你的昵称我觉得我要被关注了:excal 我还真不会
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务