linux多线程【6】单实例的进程-记录锁的使用
来源:互联网 发布:电脑数据流量统计 编辑:程序博客网 时间:2024/05/16 16:12
守护进程往往只维护一个实例,再次起一个进程时,检测到已经运行,就不会再运行了。这一点可以由记录锁来完成。
#include <unistd.h>#include <fcntl.h>#include <stdio.h>#include <string.h>#include <stdlib.h>#include <sys/stat.h>#include <errno.h>#include <syslog.h>#include <errno.h>#include <sys/types.h>#define LOCKFILE "/var/run/daemon.pid"#define LOCKMODE (S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH)intisAlreadRun (void);intlockfile (int fd);int main(){ if(isAlreadRun()) { printf("already run!\n"); return 0; } printf("first time!\n"); sleep(10); printf("pid: %d; The only thing I do is sleep!\n", getpid()); return 0;} //在整个文件上加锁 intlockfile (int fd){ struct flock fk; fk.l_type = F_WRLCK; fk.l_start = 0; fk.l_whence = SEEK_SET; fk.l_len = 0; return (fcntl (fd, F_SETLK, &fk));}intisAlreadRun (void){ int fd; char buf[16]; int errno; fd = open (LOCKFILE, O_RDWR | O_CREAT, LOCKMODE); if (fd < 0) { syslog (LOG_ERR, "can't open %s : %s", LOCKFILE, strerror (errno)); exit (1); } if (lockfile (fd) < 0) { if (errno == EACCES || errno == EAGAIN) {close (fd);return (1); } syslog (LOG_ERR, "can't lock %s : %s", LOCKFILE, strerror (errno)); exit (1); } ftruncate (fd, 0); sprintf (buf, "%ld", (long) getpid ()); write (fd, buf, strlen (buf) + 1); return 0;}
锁的是整个文件,所以其实也是文件锁。文件是
/var/run/daemon.pid如果不是root,执行的 时候需要sudo。在主函数中,测试
if(isAlreadRun())
执行:
administrator@ubuntu:~/test$ sudo ./dae & 后台运行[1] 3272 administrator@ubuntu:~/test$ first time! 回车administrator@ubuntu:~/test$ sudo ./dae 第二次运行already run! 检测到了第一次的运行,退出administrator@ubuntu:~/test$ sudo ./daealready run!administrator@ubuntu:~/test$ sudo ./daealready run!administrator@ubuntu:~/test$ sudo ./daealready run!administrator@ubuntu:~/test$ sudo ./daealready run!administrator@ubuntu:~/test$ pid: 3273; The only thing I do is sleep! 第一次结束 回车[1]+ 完成 sudo ./dae
如果已经运行,那么就退出。那么,第一次运行和第二次运行有什么不一样呢?
- linux多线程【6】单实例的进程-记录锁的使用
- linux下一个单进程并发服务器的实例 使用select
- Linux下一个单进程并发服务器的实例 使用select
- Servlet的单实例多线程
- Servlet的单实例多线程
- Linux单实例进程
- Linux多进程和多线程的一次gdb调试实例
- linux下的单实例进程 - 一个进程不能重复启动
- 守护进程的单实例实现
- 守护进程的单实例实现
- 守护进程的单实例实现
- 守护进程的单实例实现
- Servlet是单实例,多线程的吗?
- Servlet的单实例多线程机制
- 怎样理解Servlet的单实例多线程
- 怎样理解Servlet的单实例多线程
- 怎样理解Servlet的单实例多线程
- 如何理解 servlet 的单实例多线程
- CE系统启动时自动运行应用程序
- linux java环境变量设置
- php之大话工厂模式
- 读书:《Android系统源代码情景分析》- 简述Android应用程序进程的启动过程
- 深入浅出C/C++中的正则表达式库(三)——PCRE, PCRE++
- linux多线程【6】单实例的进程-记录锁的使用
- windowsCE异常和中断服务程序初探
- Struts2常用标签
- JGroups在两台机器之间找不到对方的解决方法
- 深入剖析MFC中Windows消息处理机制
- CareerCup-4.6
- C# DataGridView给行加序号
- 设计模式之状态模式
- RGB和Raw RGB