1. 由于需要,一个业务程序一天之中可能要被多次使用,但同一时间只能有一个人使用,于是我们得想个办法保证互斥。
进程间通信有很多种方式,信号量就不错。但学习使用下文件锁,更简洁一点。
2. 文件系统级别的锁有四种,最基本的两种是劝告锁和强制锁,剩下的两种是强制锁的变种。
应用级别上对锁的操作有两种,加读锁,或者加写锁(又叫共享锁与独占锁)。
那么,平时所说的加锁,实际上应该是在劝告锁或者强制锁上加读或者写锁。
3. 基本思路是,程序每次运行就打开一个固定的文件,试图加上写锁(独占性),如果之前已经有进程运行了,那么加锁操作就会失败,程序
退出,否则程序运行,直到结束(正常结束或者异常退出)都不会有其它进程运行起来。
4. 代码如下:
#define un_lock(fd, offset, whence, len) /
lock_reg(fd, F_SETLK, F_UNLCK/*解锁*/, offset, whence, len)
#define err_sys(x) { perror(x); printf("错误代码:%d %s/n", errno, strerror(errno)); exit(1); }
#define __PATHNAME "/tmp/run_once_only.pid"
int main(int argc, char* argv)
{
int fd = 0;
pid_t pid = 0, tmp=0;
if(0 > (fd=open(__PATHNAME, O_RDWR | O_CREAT, S_IRWXU|S_IRWXG)))
err_sys("open file error!");
////////
if (write_lock(fd, 0, SEEK_SET, 0) == -1) /* no wait */
err_sys("加写锁失败,已经有进程占据!");
pid = getpid();
printf("pid=%d/n", pid);
if(write(fd, &pid, sizeof(pid_t))<0)
err_sys("write pid error!");
{
sleep(500);
/*TODO something*/
}
return 1;
}