linux/unix下 pid文件作用浅析
l在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,进程继续往下执行。
如果锁定不成功,说明已经有同样的进程在运行了,当前进程结束退出。
============
用cat命令可以看到。
(2) pid文件的作用:防止进程启动多个副本。只有获得pid文件(固定路径固定文件名)写入权限(F_WRLCK)的进程才能正常启动并把自身的PID写入该文件中。其它同一个程序的多余进程则自动退出。
调用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/Unix下pid文件作用浅析
转载:http://blog.csdn.net/changli_90/article/details/8911191 在Linux系统的目录/var/run下面一般我们都会看到很多的*.pid文件.而 ...
- Linux/Unix下pid文件的作用
主要有三点: (1) pid文件的内容:pid文件为文本文件,内容只有一行, 记录了该进程的ID. 用cat命令可以看到. (2) pid文件的作用:防止进程启动多个副本.只有获得pid文件(固定路径 ...
- linux系统下修改文件夹目录权限
linux系统下修改文件夹目录权限 文件夹权限问题 Linux.Fedora.Ubuntu修改文件.文件夹权限的方法差不多.很多人开始接触Linux时都很头痛Linux的文件权限问题.这里告诉大家如何 ...
- 10分钟 教你学会Linux/Unix下的vi文本编辑器
10分钟 教你学会Linux/Unix下的vi文本编辑器 vi编辑器是Unix/Linux系统管理员必须学会使用的编辑器.看了不少关于vi的资料,终于得到这个总结.不敢独享,和你们共享. 首先,记住v ...
- 【Linux】linux/unix下telnet提示Escape character is '^]'的意义
在linux/unix下使用telnet hostname port连接上主机后会提示Escape character is '^]' 这个提示的意思是按Ctrl + ] 会呼出telnet的命令行, ...
- linux/unix下telnet提示Escape character is '^]'的意义
在linux/unix下使用telnet hostname port连接上主机后会提示Escape character is '^]' 这个提示的意思是按Ctrl + ] 会呼出telnet的命令行, ...
- Linux系统下查找文件的方法
Linux系统下查找文件的方法 作者:Vashon 时间:20150419 方法一.在当前目录里查找所有名为以 java 开头的文件: find ./ -name "java*" ...
- linux下/var/run目录下.pid文件的作用
1.pid文件的内容用cat命令查看,可以看到内容只有一行,记录了该进程的ID 2.pid文件的作用防止启动多个进程副本 3.pid文件的原理进程运行后会给.pid文件加一个文件锁,只有获得该锁的进程 ...
- Linux系统下远程文件拷贝scp命令
在Linux系统下,不同机器上实现文件拷贝 一.将本地文件拷贝到远程机器: scp /home/administrator/news.txt root@192.168.6.129:/etc/squid ...
随机推荐
- T3137 栈练习1 codevs
codevs.cn/problem/3137 题目描述 Description 给定一个栈(初始为空,元素类型为整数,且小于等于100),只有两个操作:入栈和出栈.先给出这些操作,请输出最终栈的栈顶元 ...
- python3.x之print()
1.print内容 #!/usr/bin/python print('hello world') //print("hello world") 2.print变量 #!/us ...
- [ZJOI 2018] 线图
别想多了我怎么可能会正解呢2333,我只会30分暴力(好像现场拿30分已经不算少了2333,虽然我局的30分不是特别难想). 首先求k次转化的点数显然可以变成求k-1次转化之后的边数,所以我们可以先让 ...
- Object中的wait,notify,notifyAll基本使用(转)
让线程停止运行/睡眠的方法只有两个:Thread.sleep()或者obj.wait() 记住obj.nofity()并不能停止线程运行,因为notify虽然释放了锁,但依然会急促执行完synchro ...
- ZT:与其怨天尤人,不如全力以赴;若想改变世界,你必须先从改变自己开始!
在闻名世界的威斯特敏斯特大教堂地下室的墓碑林中,有一块名扬世界的墓碑.其实这只是一块很普通的墓碑,粗糙的花岗石质地,造型也很一般,同周围那些质地上乘.做工优良的亨利三世到乔治二世等二十多位英国前国王墓 ...
- 微信小程序 - 音频播放(1.2版本和1.2版本之后)
不多说了,直接贴code // 1.2版本以后便不在维护 wx.getBackgroundAudioManager({ success:function(res){ var status =res.s ...
- 【leetcode】 26. Remove Duplicates from Sorted Array
@requires_authorization @author johnsondu @create_time 2015.7.22 18:58 @url [remove dublicates from ...
- Android中怎样自己制作su
本文原博客:http://hubingforever.blog.163.com/blog/static/171040579201372915716149/ 在Android源代码的system\ext ...
- uva 10806 Dijkstra, Dijkstra. (最小费最大流)
uva 10806 Dijkstra, Dijkstra. 题目大意:你和你的伙伴想要越狱.你的伙伴先去探路,等你的伙伴到火车站后,他会打电话给你(电话是藏在蛋糕里带进来的),然后你就能够跑去火车站了 ...
- 模式识别之聚类算法k-均值---k-均值聚类算法c实现
//写个简单的先练习一下,测试通过 //k-均值聚类算法C语言版 #include <stdlib.h> #include <stdio.h> #inc ...