扣丁学堂Linux培训简述Linux下/var/run/目录下的pid文件详解及pid文件作用

ITxuexi_66 · · 1163 次点击 · 开始浏览    置顶
这是一个创建于 的主题,其中的信息可能已经有所发展或是发生改变。

Linux系统中/var/run/目录下的*.pid文件是一个文本文件,其内容只有一行,即某个进程的PID。本篇文章扣丁学堂Linux培训小编主要给大家分享一下Linux下/var/run/目录下的pid文件详解及pid文件作用,需要的小伙伴就参考一下吧。 先给大家介绍下Linux下/var/run/目录下的pid文件,具体详解如下所示: Linux系统中/var/run/目录下的*.pid文件是一个文本文件,其内容只有一行,即某个进程的PID。.pid文件的作用是防止进程启动多个副本,只有获得特定pid文件(固定路径和文件名)的写入权限(F_WRLCK)的进程才能正常启动并将自身的进程PID写入该文件,其它同一程序的多余进程则自动退出。 编程实现: 调用fcntl()系统调用设置指定的pid文件为F_WRLCK锁状态,如果锁成功则写入当前进程的PID,进程继续往下执行;如果上锁失败则说明已经有同样的进程在运行了,当前进程退出。 #define PID_FILE "/var/run/xxxx.pid" int lock_file(int fd) { struct flock fl; fl.l_type = F_WRLCK; fl.l_start = 0; fl.l_whence = SEEK_SET; fl.l_len = 0; return (fcntl(fd, F_SETLK, &fl)); } int alone_runnind(void) { int fd; char buf[16]; fd = open(PID_FILE, O_RDWR | O_CREAT, 0666); if (fd < 0) { perror("open"); exit(1); } if (lock_file(fd) < 0) { if (errno == EACCESS || errno == EAGAIN) { close(fd); printf("alone runnind\n"); return -1; } printf("can't lock %s: %s\n", PID_FILE, strerror(errno)); } ftruncate(fd, 0); //设置文件的大小为0 sprintf(buf, "%ld", (long)getpid()); write(fd, buf, strlen(buf) + 1); return 0; } 需要注意: 1、程退出后该进程加的锁自动失效; 2、进程关闭了该文件描述符fd,则加的锁失效。(所以整个进程生命周期内不能关闭该fd); 3、锁的状态不会被子进程继承,如果进程关闭则失效而不管子进程是否运行。 下面介绍下Linux下/var/run目录下的pid文件作用 在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) 一些注意事项: 1、如果进程退出,则该进程加的锁自动失效。 2、如果进程关闭了该文件描述符fd, 则加的锁失效。(整个进程运行期间不能关闭此文件描述符) 3、锁的状态不会被子进程继承。如果进程关闭则锁失效而不管子进程是否在运行。 想要了解更多关于Linux开发方面内容的小伙伴,请关注扣丁学堂Linux培训官网、微信等平台,扣丁学堂IT职业在线学习教育有专业的Linux讲师为您指导,此外扣丁学堂老师精心推出的Linux视频教程定能让你快速掌握Linux从入门到精通开发实战技能。扣丁学堂Linux技术交流群:422345477。

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1163 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传