Linux/Unix下pid文件作用浅析

转载:http://blog.csdn.net/changli_90/article/details/8911191

在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

时间: 2024-10-06 12:45:44

Linux/Unix下pid文件作用浅析的相关文章

Linux/Unix下pid文件的作用

主要有三点: (1) pid文件的内容:pid文件为文本文件,内容只有一行, 记录了该进程的ID. 用cat命令可以看到. (2) pid文件的作用:防止进程启动多个副本.只有获得pid文件(固定路径固定文件名)写入权限(F_WRLCK)的进程才能正常启动并把自身的PID写入该文件中.其它同一个程序的多余进程则自动退出. (3) 编程技巧: 调用fcntl设置pid文件的锁定F_SETLK状态,其中锁定的标志位F_WRLCK. 如果成功锁定,则写入进程当前PID,进程继续往下执行. 如果锁定不成

linux根目录下各文件夹的作用

linux下的文件结构,看看每个文件夹都是干吗用的 /bin 二进制可执行命令 /dev 设备特殊文件 /etc 系统管理和配置文件 /etc/rc.d 启动的配置文件和脚本 /home 用户主目录的基点,比如用户user的主目录就是/home/user,可以用~user表示 /lib 标准程序设计库,又叫动态链接共享库,作用类似windows里的.dll文件 /sbin 系统管理命令,这里存放的是系统管理员使用的管理程序 /tmp 公用的临时文件存储点 /root 系统管理员的主目录(呵呵,特

linux系统下修改文件夹目录权限

linux系统下修改文件夹目录权限 文件夹权限问题 Linux.Fedora.Ubuntu修改文件.文件夹权限的方法差不多.很多人开始接触Linux时都很头痛Linux的文件权限问题.这里告诉大家如何修改Linux文件-文件夹权限.以主文件夹下的一个名为cc的文件夹为例. 下面一步一步介绍如何修改权限: 1.打开终端.输入su(没 Linux.Fedora.Ubuntu修改文件.文件夹权限的方法差不多.很多人开始接触Linux时都很头痛Linux的文件权限问题.这里告诉大家如何修改Linux文件

window下批处理操作:从Linux机器下拷贝文件

文件名称:test.bat set THIS_BAT_PATH=%~dp0 cd %THIS_BAT_PATH% rd /s /q %SDV_LLT_PATH% & md %SDV_LLT_PATH% 当前文件所在的路径:THIS_BAT_PATH=%~dp0 cd %THIS_BAT_PATH%进入到当前文件所在路径 删除该文件,并新建该文件:rd md call plink.exe -ssh -pw  password [email protected] cd /home/test;rm t

Lua 遍历Linux目录下的文件夹

代码如下,里面有注释,应该能看懂. function getFile(file_name) local f = assert(io.open(file_name, 'r')) local string = f:read("*all") f:close() return string end function writeFile(file_name,string) local f = assert(io.open(file_name, 'w')) f:write(string) f:cl

[Linux] Ubuntu下的文件比较工具--meld

在ubuntu中需要比较文件的差异,于是安装meld apt-get install meld 安装完后,在/usr/bin/下找到meld,然后发送到桌面上, 或者在命令行执行meld命令 打开后选择:file->new ,打开文件选择界面,输入两个文件的路径,后即可看到两个文件的差异情况. 界面很不错奥. 转载请注明:http://blog.csdn.net/shanzhizi [Linux] Ubuntu下的文件比较工具--meld

Windows 和 Linux 中的换行与回车的区别,Windows下编写的Shell脚本,直接放到linux/unix下执行会报错

首先: CR(Carriage Return)表示回车 LF(Line Feed)表示换行 Dos和Windows采用回车+换行(CR+LF)表示下一行而UNIX/Linux采用换行符(LF)表示下一行苹果机(MAC OS系统)则采用回车符(CR)表示下一行 Windows下编写的Shell脚本,直接放到linux/unix下执行会报错,就是因为行结束符不一样导致的. 现在好多文本工具都提供了转换功能,如我常用的,也是最强大的工具 (个人感受,不是打广告):notepad++. 原文地址:htt

linux下/var/run目录下.pid文件的作用

1.pid文件的内容用cat命令查看,可以看到内容只有一行,记录了该进程的ID 2.pid文件的作用防止启动多个进程副本 3.pid文件的原理进程运行后会给.pid文件加一个文件锁,只有获得该锁的进程才有写入权限(F_WRLCK),把自身的pid写入该文件中.其他试图获得该锁的进程会自动退出. 代码示例如下: lock.l_type=F_WRLCK; lock.l_whence=SEEK_SET; if(fcntl(fs,F_SETLK,&lock)<0){ //锁定不成功,退出 } spr

Linux系统下pid与pid文件及Hadoop更改pid文件存储位置

1.认识pid: PID全称是Process Identification.PID是进程的代号,每个进程有唯一的PID编号.它是进程运行时系统随机分配的,并不代表专门的进程.在运行时PID是不会改变标识符的,但是你终止程序后再运行PID标识符就会被系统回收,就可能会被继续分配给新运行的程序. 2.pid文件 pid文件的内容用cat命令查看,可以看到内容只有一行,记录了该进程的ID pid文件的作用防止启动多个进程副本 pid文件的原理进程运行后会给.pid文件加一个文件锁,只有获得该锁的进程才