Linux守护进程
来源:互联网 发布:网络教育报名网站 编辑:程序博客网 时间:2024/06/05 16:03
1.守护进程:
后台服务进程,不依附于终端。
2.创建守护进程的步骤:
一、创建子进程,父进程退出。
父进程退出后,子进程会变成一个孤儿进程。当系统发现孤儿进程后,init进程会收养它。
pid_t pid ;pid = fork() ;if(pid > 0){ exit(0) ;}
二、在子进程中创建新会话
创建守护进程比较重要的一步。
setsid():创建一个新的会话,并担任该会话组的组长。
进程组:一个或多个进程的集合。
会话组:一个或多个进程组的集合。一个会话开始于用户登录,终止于用户退出。
setsid 函数用于创建一个新的会话,并担任该会话组的组长。调用 setsid 有下面的 3 个作用。
• 让进程摆脱原会话的控制。
• 让进程摆脱原进程组的控制。
• 让进程摆脱原控制终端的控制。
setsid函数能够使进程完全独立出来,从而脱离所有其他守护进程的控制。
三、改变当前目录为根目录
使用 fork 创建的子进程继承了父进程的当前工作目录。因此,通常的做法是让“/”作为守护进程的当前工作目录。
使用chdir()函数
四、重设文件权限掩码
文件权限掩码是指屏蔽掉文件权限中的对应位。由于使用 fork 函数新建的子进程继承了父进程的文件权限掩码,这就给该子进程使用文件带来了诸多的麻烦。因此,把文件权限掩码设为 0,可以大大增强该守护进程的灵活性。
屏蔽掉文件权限中的对应位,使用umask()函数。
五、关闭文件描述符
守护进程已经与所属的控制终端失去了联系,因此从终端输入的字符不可能到达守护进程,所以应当关闭文件描述符0,1,2.
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <sys/stat.h>#include <sys/types.h>#include <fcntl.h>#include <syslog.h>#include <errno.h>int main(){ int fd,fd2,len; char *buf = "This program is Daemon!\n"; len = strlen(buf); /*parent process exit*/ pid_t pid; pid = fork(); if(pid < 0) return -1; if (pid >0) exit(0); setsid(); chdir("/"); umask(0); /*close fd 0,1,2*/ fd = open("/dev/null",O_RDWR); if(fd<0) { syslog(LOG_WARNING,"open() : %s",strerror(errno)); } else { dup2(fd,0); dup2(fd,1); dup2(fd,2); if(fd>2) close(fd); } /*write the string to /tmp/daemon.log*/ while(1) { if((fd2=open("/tmp/daemon.log",O_CREAT|O_WRONLY|O_APPEND,0600))<0) { perror("open"); exit(1); } write(fd2,buf,len+1); close(fd2); sleep(10); }}
我们在终端上使用tail -f /tmp/daemon.log,可以看到每隔10s中,输出This program is Daemon!
并且使用grep命令查看进程的时候,可以看到daemon在后台运行。
守护进程的调试:
- LINUX守护进程介绍
- Linux守护进程简介
- linux 守护进程编写
- linux 守护进程 daemon
- Linux实现守护进程
- Linux 守护进程
- linux 守护进程
- LINUX守护进程
- Linux 守护进程
- linux 守护进程 daemon
- linux守护进程介绍
- linux守护进程介绍
- Linux守护进程
- Linux守护进程
- Linux守护进程介绍
- linux之守护进程
- Linux 守护进程
- LINUX 守护进程
- ThinkPHP邮件发送函数
- IO指令模拟流程(6)
- 收藏的一系列教程帖子,很适合有一定基础,想要进阶的同学
- Android: 通过Runtime.getRuntime().exec调用底层Linux下的程序或脚本
- ThinkPHP中实现分页(实例)
- Linux守护进程
- 安卓开发 中文课程 (9)--颜色
- 2013腾讯实习 面试记录
- 虚拟机安装Ubuntu的上网设置(有线网络和无线网络)
- 项目四
- redhat 卸载 自带的jdk
- 面试基础题之一:构造函数体中只调用memset将对象的字节内容都置0,有什么安全隐患?
- 优化网站设计系列文章总结和导读
- IO指令模拟流程(7)