Linux/Unix下pid文件作用浅析

来源:  http://www.linuxidc.com/Linux/2012-12/76950.htm



在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年高教社杯数学建模国赛的举行,参与该竞赛的参赛团队针对B题提交了原创论文,并通过论文分享了数学建模的详细解析及源码。该论文重点解决了电子产品制造企业在生产流程中所面临的优化决策问题,具体包括四个方面的问题:最优抽样检测方案、生产决策优化、生产流程的复杂决策和基于蒙特卡洛模拟的波动敏感性模型。论文通过建立经典风险模型来解决最优抽样检测方案的问题。在这一部分,论文考虑了批量生产过程中的质量控制,利用超几何分布的概率计算公式,结合可接受的质量水平(AQL)和不可接受的质量水平(RQL),进行了数学建模,以求解在满足一定信度的条件下,如何通过最少的检测次数来实现对零配件的合格性评估。通过这一分析,论文为企业提供了在不同生产情境下的最优抽样检测方案。在生产决策优化的问题中,论文使用枚举法建立了利润函数,通过分类讨论不同的决策方式,考虑了检测、装配、拆解等一系列生产流程的经济影响。论文引入了“回收法”和状态转移的递推函数,用以判断是否拆解不合格品,并通过贝叶斯公式计算拆解后零件和成品的占比,从而找到了能够最大化企业利润的决策方案。对于第三个问题,即生产流程的复杂决策,论文在考虑决策间关联性的前提下,对问题进行了简化。通过更新成品是否拆解的判断方式,并使用贝叶斯公式计算半成品和成品的占比,构建了基于九种决策的利润函数。通过枚举法计算不同决策情况下的利润,最终得出能实现最大利润的决策方案,并将其还原至现实情境中。论文针对第四个问题,构建了基于蒙特卡洛模拟的波动敏感性模型。在这一部分,论文首先通过统计学定理证明了次品率的分布,并使用蒙特卡罗模拟评估了决策模型的鲁棒性。通过简化参数方法和允许次品率波动,模拟了模型在不同输入下的稳定性和决策一致性,最终得出决策模型对不确定性具有极高的稳定性。论文中涉及的关键概念包括:可接受的质量水平(AQL)、不可接受的质量水平(RQL)、利润函数、状态转移函数以及蒙特卡洛模拟等。这些方法和理论的应用,为电子产品制造企业提供了科学有效的决策支持,以期帮助企业解决在生产过程中遇到的质量控制和利润优化的挑战。论文通过这些问题的详细解析,不仅展示了数学建模在实际生产问题中的应用,也为读者呈现了如何通过数学方法解决复杂工业生产流程中遇到的问题,进一步推动了数学建模与实际产业结合的深入研究与实践。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值