8.c练习-多进程-单例运行&守护进程

#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);
    }

}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hehelot

感谢您的打赏!!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值