linux多线程【6】单实例的进程-记录锁的使用
2013-05-12 14:50
393 查看
守护进程往往只维护一个实例,再次起一个进程时,检测到已经运行,就不会再运行了。这一点可以由记录锁来完成。
锁的是整个文件,所以其实也是文件锁。文件是
执行:
如果已经运行,那么就退出。那么,第一次运行和第二次运行有什么不一样呢?
#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) int isAlreadRun (void); int lockfile (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; } //在整个文件上加锁 int lockfile (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)); } int isAlreadRun (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 ./dae already run! administrator@ubuntu:~/test$ sudo ./dae already run! administrator@ubuntu:~/test$ sudo ./dae already run! administrator@ubuntu:~/test$ sudo ./dae already run! administrator@ubuntu:~/test$ pid: 3273; The only thing I do is sleep! 第一次结束 回车 [1]+ 完成 sudo ./dae
如果已经运行,那么就退出。那么,第一次运行和第二次运行有什么不一样呢?
相关文章推荐
- 使用Python编写Linux系统守护进程实例
- Linux系统中的ps进程查看命令使用实例集锦
- Linux多线程与进程之间通信 实例2
- Linux下多进程编程之exec函数语法及使用实例
- System.IO系列:局域网内多线程使用命名管道在进程之间通信实例
- Linux中使用C语言的fork()函数创建子进程的实例教程
- linux下多进程和多线程编程之一(使用)
- linux下一个单进程并发服务器的实例 使用select
- System.IO系列:局域网内多线程使用命名管道在进程之间通信实例
- 【Linux】使用gdb调试多进程多线程程序
- Linux中gdb程序调试器的命令使用(包括后台进程和多线程的调试)
- Linux C进程与多线程入门—(5)使用互斥量进行同步
- Linux:如何使用gdb调试多进程多线程程序
- 使用Python编写Linux系统守护进程实例
- Linux多线程使用实例
- Linux下C程序使用多线程方式处理实例
- Linux下一个单进程并发服务器的实例 使用select
- linux 下的多进程和多线程的使用方法及对比
- Linux常用进程管理工具的使用--我的学习记录
- linux下使用gdb调试多进程多线程