1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > Linux C语言 创建一个简单的守护进程

Linux C语言 创建一个简单的守护进程

时间:2020-07-14 13:28:12

相关推荐

Linux C语言 创建一个简单的守护进程

一、什么是守护进程?

首先我们先来简单了解一下什么是守护进程,守护进程在Linux中说白了就是一个后台进程,在后台默默服务,不受终端(会话)控制,生命周期长,在系统引导装入时启动,在系统关闭时终止,并且周期性的执行某种任务或等待处理某种事件。

如果想让某个进程不因为用户或终端或其他变化而受影响,也就是说,在如果一个进程不想因为切换用户或者关闭终端的时候结束该进程,那就可以把这个进程变为一个守护进程。

二、守护进程的创建

步骤如下:

1. 创建子进程2,结束父进程1

2. 设置当前子进程2为一个终端(会话)

3. 创建子进程3,结束父进程2

此时,子进程3已经勉强算是守护进程了,但我们还需要彻底切断子进程和用户之间的联系,即重定向标准输入、标准输出、标准错误输出到设备文件 /dev/null 里。

4. 关闭所有文件描述符,节省资源,减小守护进程的内存大小

5. 改变执行目录,将执行目录切换到根目录下

6. 修改权限掩码umask

7. 将标准输入、标准输出、标准错误输出重定向到 /dev/null

代码如下:

#include <stdio.h>#include <stdlib.h>#include <sys/stat.h>#include <sys/types.h>#include <unistd.h>#include <fcntl.h>#include <string.h>void demo_init(void);int main(int argc, char *argv[]){demo_init();int fd = open("xx.txt",O_RDWR|O_CREAT|O_TRUNC,0664); //创建一个名为xx.txt的文件,权限为0664if(fd < 0){perror("open error");exit(1);}char buf[20] = "ni gan ma aiyou\n";while(1){sleep(1);bzero(buf,sizeof(buf));write(fd,buf,strlen(buf)); //将buf里的数据重复写入xx.txt里}close(fd); //关闭文件描述符return 0;}//创建守护进程void demo_init(void){//创建一个子进程2,结束父进程1if(fork()) exit(0); //将子进程2设置为终端(会话),摆脱原终端的影响if(setsid() < 0){perror("setsid error");exit(-1);}//再创建子进程3,结束父进程2,让子进程3不具备打开终端的能力if(fork())exit(0);//关闭所有文件描述符 //sysconf(_SC_OPEN_MAX)返回最大的文件描述符int i;for(i = 0;i <= sysconf(_SC_OPEN_MAX);i++) close(i);//更改子进程3的执行目录为根目录chdir("/");//修改权限掩码为0000 (默认为0002)umask(0);//重定向标准输入、标准输出、标准错误输出到null(设备文件的null)int fd = open("/dev/null",O_RDWR);dup(0); //产生fd1,指向0,0指向null,结果是标准输出1重定向到nulldup(0); //产生fd2, 指向0, 0指向null,结果是标准出错2重定向到null}

三、执行效果

1. 在命令行中执行

gcc demo.c -o demo -Wall

2. 因为我们要在根目录下创建xx.txt,不要忘记加sudo

sudo ./demo

3. 此时我们可以在根目录下看见 xx.txt

4. 关闭当前终端,重新打开终端,用命令 ps -aux 可以看到我们创建的demo进程还在,说明我们已经成功创建一个守护进程。

5. 结束进程,方法有两种,一是重启ubuntu系统,二是用命令kill掉

sudo kill -9 3240

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。