您的位置:首页 > 其它

编写简单守护进程

2016-09-25 18:54 197 查看
《朱老师物联网大讲堂》学习笔记      
学习地址:www.zhulaoshi.org

任何进程都可以将自己实现为守护进程,

creat_daemon实现,

1,子进程的父进程退出,

2,子进程使用setsid创建新的会话期,脱离控制台,

3,调用chdir将当前工作目录设置为/,这样就不依赖其它文件系统了,

4,umask设置为0,以取消任何文件权限屏蔽,

5,关闭所有文件描述符,

6,将0,1,2文件描述符定位到/dev/null,即定位到垃圾堆,

以下代码,是朱老师课上讲解实例代码,
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

void create_daemon(void);

int main(void)
{
create_daemon();

while (1)
{
printf("I am running.\n");

sleep(1);
}

return 0;
}

// 函数作用就是把调用该函数的进程变成一个守护进程
void create_daemon(void)
{
pid_t pid = 0;

pid = fork();
if (pid < 0)
{
perror("fork");
exit(-1);
}
if (pid > 0)
{
exit(0);		// 父进程直接退出
}

// 执行到这里就是子进程

// setsid将当前进程设置为一个新的会话期session,目的就是让当前进程
// 脱离控制台。
pid = setsid();
if (pid < 0)
{
perror("setsid");
exit(-1);
}

// 将当前进程工作目录设置为根目录
chdir("/");

// umask设置为0确保将来进程有最大的文件操作权限
umask(0);

// 关闭所有文件描述符
// 先要获取当前系统中所允许打开的最大文件描述符数目
int cnt = sysconf(_SC_OPEN_MAX);
int i = 0;
for (i=0; i<cnt; i++)
{
close(i);
}

open("/dev/null", O_RDWR);
open("/dev/null", O_RDWR);
open("/dev/null", O_RDWR);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: