文件IO与进程 创建守护进程(c语言)

         摘要:进程相关知识点

        进程有三种类型:①交互进程,②批处理进程,③守护进程

交互进程:和终端相关,可以在前台进行,也可以在后台运行,关闭终端,进程结束。

批处理进程:跟终端无关,可以将指定的进程放在一个工作队列中按照顺序执行,一般由系统管理。

守护进程:与终端无关,并且在后台一直某些事件或者等待某些事件响应。列如,我们电脑上插入U盘时,电脑会立即识别,识别U盘这个程序我们并没有做任何操作,它是一直在后台运行着的,这便是守护进程。

今天我要讲的便是如何创建一个守护进程,守护进程创建一般有六个步骤,分别是:

1)创建进程(fork()函数),父进程退出(exit( )函数)让子进程变为孤儿进程,让其转到后台运行;

2)让子进程脱离原本会话(setsid()函数)(意思是即使关闭终端也可以执行);

3)修改当前工作路径(chdir()函数,这一步非必要,但建议也执行);

4)重设文件权限掩码(umask(0) 函数 “0”代表原本权限是多少就是多少,这一步也是非必要,但建议也执行)

5)删除进程中所有文件描述符(getdtablesize()函数  返回的是最高的文件描述符,可用循环删除),为了让守护进程更加稳定。

6)用while(1)循环执行子进程。

        今天我给大家演示的是守护进程的创建,例子为:创建一个守护进程,每隔一秒记录当前时间到time.log当中。代码如下

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

int main(int argc, char *argv[])
{
    pid_t pid = fork();  //创建子进程
    if(pid<0) //判断子进程是否创建成功
    {   
        perror("fork");
        exit(0);
    }
    if(pid>0) //父进程
    {
        exit(0);//退出父进程,让子进程变为孤儿进程。
    }
    else  //子进程
    {
       setsid();  //让子进程脱离原本会话
     */  chdir("/tmp"); //修改当前工作路径
         umask(0); // 重设文件权限掩码
         当然,修改完路径之后对应的日志文件也要拿到/tmp下面去,不然进程找不到文件,
         我这里只做个示范,就不修改路径了,直接在当前路径执行。   
     */
       int i =0;
       for(i=0;i<getdtablesize();i++)  //删除进程中所有的文件描述符
       {
            close(i);
       }
       FILE *fp = fopen("time.log","a+"); //打开日志文件
       if(fp==NULL)
       {
            perror("fopen");
            exit(0);
       }
       while(1)  //循环写入当前时间
       {
            time_t my_t;
            time(&my_t);  //获取当前时间(秒数)
            struct tm *t = localtime(&my_t); //调用函数获取当前时间(年月日时分秒)
            int num[6]={t->tm_year+1900,t->tm_mon+1,t->tm_mday,t->tm_hour,t->tm_min,t->tm_sec};//时间装入数组
            fprintf(fp,"%2d年 %2d月 %2d日 %02d:%02d:%02d\n",num[0],num[1],num[2],num[3],num[4],num[5]);//写入日志文件
            sleep(1); //每隔一秒写入一次
       }
    }

    return 0;
}

运行结果:

即使关闭了终端,子进程也在运行着,可以通过ps -ef命令看进程状态;

        今天的分享到此结束了,作者也是新手 哪里不对的地方欢迎大家多多指正,也感谢各位姥爷的观看。

猜你喜欢

转载自blog.csdn.net/weixin_56187542/article/details/126233393