Linux守护进程实现程序只运行一次
2018-06-18 04:11:17来源:未知 阅读 ()
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 }
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:c语言是如何实现泛型链表
- Building & Debugging chromium on CLion for Linu 2020-05-19
- CreateEvent进程同步 2020-04-19
- 非常详细的 Linux C/C++ 学习路线总结!已拿腾讯offer 2020-03-29
- linux环境下的时间编程 2020-03-27
- windows上编译linux程序代码需要用到的头文件 2020-03-06
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash