#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#define DEBUG //DEBUG时需要打开
#ifndef DEBUG
#define dbg(format, ...) while(0)
#else
#define dbg(format, ...) printf(format, ##__VA_ARGS__)
#endif
void create_daemon(void);
void run_only(void);
void exit_func(void)
{
int flag = -1;
flag = remove("./.only");
if(0 == flag)
{
printf("程序结束!\n");
}else
{
printf("程序结束,隐藏文件未被删除!\n");
}
}
int main(void)
{
run_only();//单例运行
create_daemon();
atexit(exit_func);
while (1)
{
printf("运行\n");
sleep(1);
}
return 0;
}
// 创建守护进程
//create_daemon函数要素
// (1)子进程等待父进程退出
// (2)子进程使用setsid创建新的会话期,脱离控制台
// (3)调用chdir将当前工作目录设置为/
// (4)umask设置为0以取消任何文件权限屏蔽
// (5)关闭所有文件描述符
// (6)将0、1、2定位到/dev/null
void create_daemon(void)
{
pid_t pid = -1;
int ret = -1;
int cnt = 0;
pid = fork();
if(0 > pid)
{
perror("fork error");
exit(-1);
}
if(0 < pid) //父进程,退出
{
exit(0);
}
// 子进程继续
pid = setsid();//设置新的会话期
if (pid < 0)
{
perror("setsid");
exit(-1);
}
ret = chdir("/"); //更改当前工作目录
if(-1 == ret)
{
perror("chdir error");
exit(-1);
}
umask(0);// 取消任何文件权限屏蔽
// 关闭所有文件描述符
dbg("pid = %d \n", getpid());
#if 1
cnt = sysconf(_SC_OPEN_MAX);//获取一些系统的参数
for(int i = 0;i < cnt; i++)
{
close(i);
}
// 将0、1、2定位到/dev/null
open("/dev/null",O_RDWR);
open("/dev/null",O_RDWR);
open("/dev/null",O_RDWR);
#endif
}
// 使程序只可以运行一个
void run_only(void)
{
int flag = -1;
flag = open("./.only", O_CREAT|O_EXCL, 0777);
dbg("flag : %d\n", flag);
if(-1 == flag)
{
perror("程序已经在运行了!");
exit(0);
}
}
8.c练习-多进程-单例运行&守护进程
最新推荐文章于 2023-04-11 18:45:22 发布