Linux守护进程实现程序只运行一次

1.守护进程

守护进程(Daemon)是一种运行在后台的特殊进程,它独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件。

2.让程序只运行一次

如果让程序只运行一次,有很多方法,此处的一种方法是创建一个名字古怪的文件(保证不跟系统文件或其他文件重名),判断文件存在则让程序不再运行且提示程序正在运行,如果不存在则可以运行。

3.测试代码

此代码额外添加了系统LOG,记录操作的信息。

  1 #include <stdio.h>
  2 #include <unistd.h>
  3 #include <stdlib.h>
  4 #include <syslog.h>
  5 #include <sys/types.h>
  6 #include <sys/stat.h>
  7 #include <fcntl.h>
  8 #include <errno.h>
  9
 10 #define FILE    "/var/cxl_single_file"
 11
 12 // 函数声明
 13 void create_daemon(void);
 14 void delete_file(void);
 15
 16 int main(int argc, char **argv)
 17 {
 18     int fd = -1;
 19
 20     // 打开LOG系统
 21     openlog(argv[0], LOG_PID | LOG_CONS, LOG_USER);
 22
 23     // 打开文件,不存在则创建,存在则报错误提示
 24     fd = open(FILE, O_RDWR | O_TRUNC | O_CREAT | O_EXCL, 0664);
 25     if ( fd < 0 )
 26     {
 27
 28         if ( errno == EEXIST )
 29         {
 30             printf("%s is running...\n", argv[0]);
 31             _exit(-1);
 32         }
 33     }
 34     syslog(LOG_INFO, "Create file success!");
 35
 36     // 注册进程清理函数
 37     atexit(delete_file);    //  Kill -9 PID 后 此函数没有运行
 38
 39     close(fd);
 40     closelog();
 41
 42     // 创建守护进程
 43     create_daemon();
 44     while (1);
 45
 46     return 0;
 47 }
 48
 49 // create_daemon() 创建守护进程
 50 void create_daemon(void)
 51 {
 52     int i = 0, cnt = 0;
 53     pid_t pid = -1;
 54
 55     pid = fork();
 56     if ( -1 == pid)
 57     {
 58         perror("fork");
 59         _exit(-1);
 60     }
 61     if ( pid > 0 )
 62     {
 63         // 子进程等待父进程退出
 64         _exit(0);
 65     }
 66
 67     /* 此处是子进程执行 */
 68     // setsid() 子进程创建新的会话期,脱离控制台
 69     pid = setsid();
 70     if ( -1 == pid )
 71     {
 72         perror("setsid");
 73         _exit(-1);
 74     }
 75
 76     // chdir() 调用此函数将当前工作目录设置为/
 77     chdir("/");
 78
 79     // umask() 设置为0以取消任何文件权限屏蔽
 80     umask(0);
 81
 82     // 关闭所有文件描述符
 83     // sysconf() 获取当前系统中文件描述符的最大数目
 84     cnt = sysconf(_SC_OPEN_MAX);
 85     for ( i = 0; i < cnt; i++ )
 86     {
 87         close(i);
 88     }
 89
 90     // 将0、1、2定位到/dev/null
 91     open("/dev/null", O_RDWR);
 92     open("/dev/null", O_RDWR);
 93     open("/dev/null", O_RDWR);
 94 }
 95
 96 // 删除文件
 97 void delete_file(void)
 98 {
 99     remove(FILE);
100 }
时间: 2024-12-26 06:30:04

Linux守护进程实现程序只运行一次的相关文章

[Linux] 守护进程和守护线程

对于JAVA而言,一般一个应用程序只有一个进程——JVM.除非在代码里面另外派生或者开启了新进程. 而线程,当然是由进程开启的.当开启该线程的进程离开时,线程也就不复存在了. 所以,对于JAVA而言,线程是完全可以由自己的API自由产生.例如new Thread().但是进程就不同,必须通过调用OS的API,如Runtime.getRuntime.exec(). 所以说,进程是OS级别的概念. 守护线程和用户线程的区别: 二者其实基本上是一样的.唯一的区别在于JVM何时离开. 用户线程:当存在任

.NET跨平台实践:用C#开发Linux守护进程

Linux守护进程(Daemon)是Linux的后台服务进程,它脱离了与控制终端的关联,直接由Linux init进程管理其生命周期,即使你关闭了控制台,daemon也能在后台正常工作. 一句话,为Linux开发与控制台无关的,需要在后台长时间不间断运行的“服务程序”,Daemon技术是非常重要的. Daemon程序一般用c/c++开发.不过,我今天要讲的,不是怎么用c/c++开发daemon,而是用C#! 一,创建Daemon程序: 用VS新建一个控制台项目,假设名称是MyDaemon,输入下

Linux守护进程详解(init.d和xinetd)

一 Linux守护进程 Linux 服务器在启动时需要启动很多系统服务,它们向本地和网络用户提供了Linux的系统功能接口,直接面向应用程序和用户.提供这些服务的程序是由运行在后台的守护进程来执行的.守护进程是生存期长的一种进程.它们独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件.他们常常在系统引导装入时启动,在系统关闭时终止.linux系统有很多守护进程,大多数服务器都是用守护进程实现的.同时,守护进程完成许多系统任务,比如,作 业规划进程crond.打印进程lqd等.有些书籍

Linux守护进程(init.d和xinetd)

一 Linux守护进程 Linux 服务器在启动时需要启动很多系统服务,它们向本地和网络用户提供了Linux的系统功能接口,直接面向应用程序和用户.提供这些服务的程序是由运行在后台 的守护进程来执行的.守护进程是生存期长的一种进程.它们独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件.他们常常在系统引导装入时启 动,在系统关闭时终止.linux系统有很多守护进程,大多数服务器都是用守护进程实现的.同时,守护进程完成许多系统任务,比如,作 业规划进程crond.打印进程lqd等.有些

.NET跨平台实践:用C#开发Linux守护进程-Daemon

Linux守护进程(Daemon)是Linux的后台服务进程,它脱离了与控制终端的关联,直接由Linux init进程管理其生命周期,即使你关闭了控制台,daemon也能在后台正常工作. 一句话,为Linux开发与控制台无关的,需要在后台长时间不间断运行的“服务程序”,Daemon技术是非常重要的. Daemon程序一般用c/c++开发.不过,我今天要讲的,不是怎么用c/c++开发daemon,而是用C#! 一,创建Daemon程序: 用VS新建一个控制台项目,假设名称是MyDaemon,输入下

.NET跨平台实践:用C#开发Linux守护进程(转)

Linux守护进程(Daemon)是Linux的后台服务进程,它脱离了与控制终端的关联,直接由Linux init进程管理其生命周期,即使你关闭了控制台,daemon也能在后台正常工作. 一句话,为Linux开发与控制台无关的,需要在后台长时间不间断运行的“服务程序”,Daemon技术是非常重要的. Daemon程序一般用c/c++开发.不过,我今天要讲的,不是怎么用c/c++开发daemon,而是用C#! 一,创建Daemon程序: 用VS新建一个控制台项目,假设名称是MyDaemon,输入下

转:linux守护进程的启动方法

Linux 守护进程的启动方法 作者: 阮一峰 日期: 2016年2月28日 "守护进程"(daemon)就是一直在后台运行的进程(daemon). 本文介绍如何将一个 Web 应用,启动为守护进程. 一.问题的由来 Web应用写好后,下一件事就是启动,让它一直在后台运行. 这并不容易.举例来说,下面是一个最简单的Node应用server.js,只有6行. var http = require('http'); http.createServer(function(req, res)

C#开发Linux守护进程

C#开发Linux守护进程 Linux守护进程是Linux的后台服务进程,相当于Windows服务,对于为Linux开发服务程序的朋友来说,Linux守护进程相关技术是必不可少的,因为这个技术不仅仅是为了开发守护进程,还可以拓展到多进程,父子进程文件描述符共享,父子进程通讯.控制等方面,是实现Linux大型服务的基础技术之一. 去年我也曾写了一篇关于守护进程的帖子,名字叫<.NET跨平台实践:用C#开发Linux守护进程>,这篇文章的的确确实现了一个Daemon,不过,它有一个弱点,不能运行多

Linux 守护进程和超级守护进程(xinetd)

一 .Linux守护进程 Linux 服务器在启动时需要启动很多系统服务,它们向本地和网络用户提供了Linux的系统功能接口,直接面向应用程序和用户.提供这些服务的程序是由运行在后台的守护进程来执行的. 守护进程是生存期长的一种进程.它们独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件.他们常常在系统引导装入时启动,在系统关闭时终止. linux系统有很多守护进程,大多数服务器都是用守护进程实现的.同时,守护进程完成许多系统任务,比如,作 业规划进程crond.打印进程lqd等.有