守护进程编程步骤
来源:互联网 发布:淘宝主图怎么拍摄 编辑:程序博客网 时间:2024/06/08 06:22
守护进程编程步骤
1. 创建子进程,父进程退出
•所有工作在子进程中进行
•形式上脱离了控制终端
2. 在子进程中创建新会话
•setsid()函数
•使子进程完全独立出来,脱离控制
3. 改变当前目录为根目录
•chdir()函数
•防止占用可卸载的文件系统
•也可以换成其它路径
4. 重设文件权限掩码
•umask()函数
•防止继承的文件创建屏蔽字拒绝某些权限
•增加守护进程灵活性
5. 关闭文件描述符
•继承的打开文件不会用到,浪费系统资源,无法卸载
•getdtablesize()
•返回所在进程的文件描述符表的项数,即该进程打开的文件数目
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/wait.h> #include <sys/types.h> #include <fcntl.h> #include <syslog.h> int main() { pid_t pid; int i,fd; char *buf="This is a daemon program.\n"; if ((pid = fork()) < 0) { printf("fork error!"); exit(1); }else if (pid > 0) { // 第一步,fork且退出父进程 exit(0); } openlog("daemon_syslog",LOG_PID, LOG_DAEMON); if ((setsid()) < 0){ // 第二步,在子进程中创建新会话。 syslog(LOG_ERR, "%s\n", "setsid"); exit(1); } if ((chdir("/")) < 0) { // 第三步,设置工作目录为根 syslog(LOG_ERR, "%s\n", "chdir"); exit(1); } umask(0); // 第四步,设置权限掩码 for(i = 0 ;i < getdtablesize(); i++) //第五步,getdtablesize返回子进程文件描述符表的项数 close(i); // 关闭这些不将用到的文件描述符 syslog(LOG_INFO, "%d", getpid()); while (1) {// 死循环表征它将一直运行 // 以读写方式打开"/tmp/daemon.log",返回的文件描述符赋给fd if ((fd = open("/tmp/daemon.log", O_CREAT|O_WRONLY|O_APPEND, 0600)) < 0) { syslog(LOG_ERR, "Open file error!\n"); exit(1); } // 将buf写到fd中 write(fd, buf, strlen(buf) + 1); close(fd); sleep(10); printf("Never output!\n"); } closelog(); return 0; }
因为stdout被关掉了,所以“Never ouput!”不会输出。
查看/tmp/daemon.log,说明该程序一直在运行
tail /tmp/daemon.log
查看系统日记,cat /var/log/syslog 可看到输出:
Jan 8 17:04:57 cxw-VM daemon_syslog[25393]: 25393
- 守护进程编程步骤
- 创建守护进程步骤
- 守护进程创建步骤
- 守护进程创建步骤
- 守护进程-步骤
- 实现守护进程的步骤
- 实现守护进程的步骤
- 守护进程的创建步骤
- 创建守护进程的步骤
- 实现守护进程的步骤
- linux守护进程编写步骤
- 创建守护进程的步骤
- 创建守护进程的步骤
- linux 守护进程编程
- Linux编程---守护进程
- 守护进程编程要点
- linux 守护进程编程
- linux守护进程编程
- TCP协议三次握手过程分析
- Qt210uart学习笔记
- 0x77c13869指令的0x00000080内存。该内存不能为read
- TCP三次握手/四次挥手详解
- 机器学习、数据挖掘、计算机视觉等领域经典书籍推荐
- 守护进程编程步骤
- 中国现役军衔制
- 性能瓶颈
- 设计模式原则
- Log4net源码分析(一)
- Log4net源码分析(二)
- Qt210时钟学习笔记
- Log4net源码分析(三)
- java.lang.StackOverflowError