Linux守护进程实现程序只运行一次
1.守护进程
守护进程(Daemon)是一种运行在后台的特殊进程,它独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件。
2.让程序只运行一次
如果让程序只运行一次,有很多方法,此处的一种方法是创建一个名字古怪的文件(保证不跟系统文件或其他文件重名),判断文件存在则让程序不再运行且提示程序正在运行,如果不存在则可以运行。
3.测试代码
此代码额外添加了系统LOG,记录操作的信息。
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <syslog.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h> #define FILE "/var/cxl_single_file" // 函数声明
void create_daemon(void);
void delete_file(void); int main(int argc, char **argv)
{
int fd = -; // 打开LOG系统
openlog(argv[], LOG_PID | LOG_CONS, LOG_USER); // 打开文件,不存在则创建,存在则报错误提示
fd = open(FILE, O_RDWR | O_TRUNC | O_CREAT | O_EXCL, );
if ( fd < )
{ if ( errno == EEXIST )
{
printf("%s is running...\n", argv[]);
_exit(-);
}
}
syslog(LOG_INFO, "Create file success!"); // 注册进程清理函数
atexit(delete_file); // Kill -9 PID 后 此函数没有运行 close(fd);
closelog(); // 创建守护进程
create_daemon();
while (); return ;
} // create_daemon() 创建守护进程
void create_daemon(void)
{
int i = , cnt = ;
pid_t pid = -; pid = fork();
if ( - == pid)
{
perror("fork");
_exit(-);
}
if ( pid > )
{
// 子进程等待父进程退出
_exit();
} /* 此处是子进程执行 */
// setsid() 子进程创建新的会话期,脱离控制台
pid = setsid();
if ( - == pid )
{
perror("setsid");
_exit(-);
} // chdir() 调用此函数将当前工作目录设置为/
chdir("/"); // umask() 设置为0以取消任何文件权限屏蔽
umask(); // 关闭所有文件描述符
// sysconf() 获取当前系统中文件描述符的最大数目
cnt = sysconf(_SC_OPEN_MAX);
for ( i = ; 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);
} // 删除文件
void delete_file(void)
{
remove(FILE);
}
Linux守护进程实现程序只运行一次的更多相关文章
- [Linux] 守护进程和守护线程
对于JAVA而言,一般一个应用程序只有一个进程——JVM.除非在代码里面另外派生或者开启了新进程. 而线程,当然是由进程开启的.当开启该线程的进程离开时,线程也就不复存在了. 所以,对于JAVA而言, ...
- .NET跨平台实践:用C#开发Linux守护进程
Linux守护进程(Daemon)是Linux的后台服务进程,它脱离了与控制终端的关联,直接由Linux init进程管理其生命周期,即使你关闭了控制台,daemon也能在后台正常工作. 一句话,为L ...
- .NET跨平台实践:用C#开发Linux守护进程(转)
Linux守护进程(Daemon)是Linux的后台服务进程,它脱离了与控制终端的关联,直接由Linux init进程管理其生命周期,即使你关闭了控制台,daemon也能在后台正常工作. 一句话,为L ...
- [转]❲阮一峰❳Linux 守护进程的启动方法
❲阮一峰❳Linux 守护进程的启动方法 "守护进程"(daemon)就是一直在后台运行的进程(daemon). 本文介绍如何将一个 Web 应用,启动为守护进程. 一.问题的由来 ...
- Server Develop (七) Linux 守护进程
守护进程 守护进程,也就是通常说的Daemon进程,是Linux中的后台服务进程.它是一个生存期较长的进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件.守护进程常常在系统引导装 ...
- Linux守护进程详解(init.d和xinetd) [转]
一 Linux守护进程 Linux 服务器在启动时需要启动很多系统服务,它们向本地和网络用户提供了Linux的系统功能接口,直接面向应用程序和用户.提供这些服务的程序是由运行在后台 的守护进程来执行的 ...
- Linux守护进程详解(init.d和xinetd)
一 Linux守护进程 Linux 服务器在启动时需要启动很多系统服务,它们向本地和网络用户提供了Linux的系统功能接口,直接面向应用程序和用户.提供这些服务的程序是由运行在后台的守护进程来执行的. ...
- C#开发Linux守护进程
用C#开发Linux守护进程 Linux守护进程(Daemon)是Linux的后台服务进程,它脱离了与控制终端的关联,直接由Linux init进程管理其生命周期,即使你关闭了控制台,daemon ...
- linux守护进程、SIGHUP与nohup详解
前端时间帮忙定位个问题.docker容器故障恢复后,其中的keepalived进程始终无法启动,也看不到Keepalived的日志. strace 查看系统调用之后,发现了原因所在 socket(PF ...
随机推荐
- android: adapter getView(position==0) was invoked many times.
this is a big problem for me. i follow the solutions that i searched from the internet: modify the ...
- (笔记)Linux内核学习(九)之内核内存管理方式
一 页 内核把物理页作为内存管理的基本单位:内存管理单元(MMU)把虚拟地址转换为物理 地址,通常以页为单位进行处理.MMU以页大小为单位来管理系统中的也表. 32位系统:页大小4KB 64位系统:页 ...
- 关于android中线性布局的layout_gravity属性
当 android:orientation="vertical" 时, 只有水平方向的设置才起作用,垂直方向的设置不起作用.即:left,right,center_horizon ...
- 哈希表用于Key与Value的对应
一个类的某个属性要实现Key与Value的对应,以便通过访问名称就可以知道对应值,而不是通过索引号,最简单的方法直接用 哈希表using System.Collections;class Class1 ...
- 给MySQL官方提交的bug report备忘
1. Bug #72215 When LOCK_plugin conflicts very much, one uninstall-audit-plugin operation crash htt ...
- 使用IntelliJ IDEA 14和Maven创建java web项目
参考地址 http://www.cnblogs.com/jifeng/p/4658765.html
- android中的提示信息显示方法(toast应用)
android中的提示信息显示方法(toast应用) (2011-10-17 11:02:06) 转载▼ 标签: android toast 杂谈 分类: Android android中toast的 ...
- jquery $.proxy使用
在某些情况下,我们调用Javascript函数时候,this指针并不一定是我们所期望的那个.例如: //正常的this使用 $('#myElement').click(function() { // ...
- K3 WISE开发手册
1.VB插件工程的命名.命名空间和生成的DLL命名要一致,否则导致注册不成功!
- 在redhat上搭建redmine
搞个项目管理的东西 找了下还是redmine比较合适,行动action: 1.ruby 额 是的你没有看错 需要先安装一个ruby的环境.话说这个安装起来很是纠结,本来想用yum 结果咩有成功,于是乎 ...