Linux/Unix下pid文件作用浅析

转载 2015年07月09日 20:05:20

在Linux系统的目录/var/run下面一般我们都会看到很多的*.pid文件。而且往往新安装的程序在运行后也会在/var/run目录下面产生自己的pid文件。那么这些pid文件有什么作用呢?它的内容又是什么呢?

(1) pid文件的内容:pid文件为文本文件,内容只有一行, 记录了该进程的ID。

用cat命令可以看到。

(2) pid文件的作用:防止进程启动多个副本。只有获得pid文件(固定路径固定文件名)写入权限(F_WRLCK)的进程才能正常启动并把自身的PID写入该文件中。其它同一个程序的多余进程则自动退出。

(3) 编程技巧:

调用fcntl设置pid文件的锁定F_SETLK状态,其中锁定的标志位F_WRLCK。

如果成功锁定,则写入进程当前PID,进程继续往下执行。

如果锁定不成功,说明已经有同样的进程在运行了,当前进程结束退出。

lock.l_type = F_WRLCK; lock.l_whence = SEEK_SET;

if (fcntl(fd, F_SETLK, &lock) < 0){     //锁定不成功, 退出...... } sprintf (buf, "%d\n", (int) pid); pidsize = strlen(buf); if ((tmp = write (fd, buf, pidsize)) != (int)pidsize){     //写入不成功, 退出...... }

(4) 一些注意事项: i) 如果进程退出,则该进程加的锁自动失效。 ii) 如果进程关闭了该文件描述符fd, 则加的锁失效。(整个进程运行期间不能关闭此文件描述符) iii) 锁的状态不会被子进程继承。如果进程关闭则锁失效而不管子进程是否在运行。 (Locks are associated with processes. A process can only have one kind of lock set for each byte of a given file. When any file descriptor for that file is closed by the process, all of the locks that process holds on that file are released, even if the locks were made using other descriptors that remain open. Likewise, locks are released when a process exits, and are not inherited by child processes created using fork.)

(5) 参考资料: fcntl(文件锁) 表头文件 #include <unistd.h> #include <fcntl.h> 函数定义int fcntl(int fd, int cmd, struct flock *lock); 函数解释fd:文件描写符 设置的文件描写符,参数cmd代表欲垄断的号召 F_DUPFD 复制参数fd的文件描写符,厉行获胜则归来新复制的文件描写符, F_GETFD 获得close-on-exec符号,若些符号的FD_CLOEXEC位为0,代表在调用 exec()相干函数时文件将不会关闭 F_SETFD 设置close-on-exec符号,该符号以参数arg的 FD_CLOEXEC位定夺 F_GETFL获得open()设置的符号 F_SETFL改换open()设置的符号 F_GETLK获得文件锁定的事态,依据lock的描写,定夺是否上文件锁 F_SETLK设置文件锁定的事态,此刻flcok,构造的l_tpye值定然是F_RDLCK、F_WRLCK或F_UNLCK, 万一无法发生锁定,则归来-1 F_SETLKW 是F_SETLK的阻塞版本,在无法获得锁时会进去睡眠事态,万一能够获得锁可能捉拿到信号则归来 参数lock指针为flock构造指针定义如下 struct flock { ... short l_typejngaoy.com; short l_whence; off_t l_start; 锁定区域的开关位置 off_t l_len; 锁定区域的大小 pid_t l_pid; 锁定动作的历程 ... }; 1_type有三种事态: F_RDLCK读取锁(分享锁) F_WRLCK写入锁(排斥锁) F_UNLCK解锁 l_whence也有三种措施 SEEK_SET以文件开始为锁定的起始位置 SEEK_CUR以现在文件读写位置为锁定的起始位置 SEEK_END以文件尾为锁定的起始位置 归来值 获胜则归来0,若有讹谬则归来-1 l_len:加锁区的长度 l_pid:具有阻塞目前历程的锁,其持有历程的历程号储藏在l_pid中,由F_GETLK归来 等闲是将l_start设置为0,l_whence设置为SEEK_SET,l_len设置为0

Linux/Unix下pid文件作用浅析

在Linux系统的目录/var/run下面一般我们都会看到很多的*.pid文件。而且往往新安装的程序在运行后也会在/var/run目录下面产生自己的pid文件。那么这些pid文件有什么作用呢?它的内容...
  • dsg333
  • dsg333
  • 2013年09月12日 22:40
  • 358

linux/unix下 pid文件作用浅析

l在linux系统的目录/var/run下面一般我们都会看到很多的*.pid文件。而且往往新安装的程序在运行后也会在/var/run目录下面产生自己的pid文件。那么这些pid文件有什么作用呢?它的内...
  • yinqingwang
  • yinqingwang
  • 2016年10月17日 20:52
  • 1644

ceph存储 Linux/Unix下pid文件作用浅析

在Linux系统的目录/var/run下面一般我们都会看到很多的*.pid文件。而且往往新安装的程序在运行后也会在/var/run目录下面产生自己的pid文件。那么这些pid文件有什么作用呢?它的内容...
  • skdkjxy
  • skdkjxy
  • 2015年01月14日 15:06
  • 610

linux deamon中常使用的pid file

    linux中一些deamon程序,由于一般只运行一个,因此就只有一个唯一的pid,因此为了其他程序方便知道该deamon的pid,就自建了一个pid file,一般是/var/run/d...
  • bailyzheng
  • bailyzheng
  • 2014年07月13日 21:03
  • 1835

linux 执行多jetty 9.1.0版

第一个jetty 正常部署 第二个jetty 1)
  • longjunjiafubiao
  • longjunjiafubiao
  • 2014年07月08日 23:08
  • 1026

Linux/Unix环境下的make和makefile

介绍一下make及其描述文件makefile Makefile文件         Make工具最主要也是最基本的功能就是通过makefile文件来描述源程序之间 的相互关系并自动维护编译工作。而ma...
  • sinat_34157462
  • sinat_34157462
  • 2016年04月20日 19:39
  • 1000

linux pid文件

在Linux系统的目录/var/run下面一般我们都会看到很多的*.pid文件作用 防止进程启动多个副本 有写入权限(F_WRLCK)的进程才能正常启动并把自身的PID写入该文件中fcntlint...
  • zhangxuechao_
  • zhangxuechao_
  • 2015年09月14日 11:43
  • 542

UNIX的进程终止状态小结

在UNIX中
  • lpf6288128
  • lpf6288128
  • 2014年05月11日 20:04
  • 849

UNIX一切皆文件!!

忘记从哪里听到这样一句话,UNIX一切皆文件。下面是我的理解,这句话真的UNIX最精髓的一句话! 我在研究管道的时候,用到popen和pclose,这里popen返回值是FILE *fp,大多是理解...
  • u010893262
  • u010893262
  • 2017年05月09日 17:32
  • 206

linux 批量删除进程的两种方法

linux批量删除进程的两种方法   介绍两种方法。要kill的进程都有共同的字串。   [plain]  kill -9 `ps -ef |grep xxx|awk '{print $2}...
  • konglongaa
  • konglongaa
  • 2016年09月29日 15:22
  • 304
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Linux/Unix下pid文件作用浅析
举报原因:
原因补充:

(最多只允许输入30个字)