linux下单例进程的一个实现方式

今天在论坛上有朋友问如果截获SIGKILL信号,然后删除锁文件,他主要想要做一个单例进程,进程开始时判断一个文件config的存在性,如果不存在,则创建之然后运行,如果已经存在那么进程退出,进程在退出的时候必须把这个config文件删除以确保不能影响下一次进程的运行,但是问题出来了,如果有人用SIGKILL把他的进程杀死怎么办?于是我的回答就是再建一个进程守护着它的运行,比如用心跳检测就可以,一旦检测不到这个进程的心跳了,那么就帮忙删除掉这个config文件,另一种做法就是将这个单例的进程作为一个父进程的子进程运行,然后在父进程中设置SIGCHLD信号处理器,一旦子进程被杀,那么就会发送信号给父进程,然后父进程在信号处理中可以删除config文件,这样做的话仅仅是多了一层保护,试想如果守护此进程运行的进程或者这个进程的父进程被杀怎么办?改内核是一种方式,比如钩住do_exit内核函数,然后判断结束的是哪个进程后做善后处理,但是如果谁都要通过改内核行为来解决问题的话,那么操作系统的意义何在,内核是为系统服务的,而不是为用户服务的,因此不要指望内核行为完成用户策略,因此这些方式都还不是十全十美的方式。十全十美的方式就是自洽的,不需要别的东西帮忙的方式,不用别的进程,不用什么锁文件,而且这种方式还不能影响别的进程,不能给系统带来不稳定性,因此linux的“小即是好”的思想派上了用场,linux总是可以用很多很小的东西组合成一个很猛的功能,比如今天我想到的一个办法就是用管道实现的。在windows上也可以这么实现但是windows上的管道要复杂些,而且windows中还可以有别的很多方式,比如windows中可以设置全局的信号量和互斥体,它们都可以实现,windows的粒度某种意义上更小,比如windows可以基于窗口发送消息,而linux在系统范围内发送消息的最小单位就是进程,比如基于进程发送信号,虽然如此,windows总是带来很多混乱因为它没有处理好大和小的边界,粒度小是好的,比如像linux哲学所述的那样,但是过于小的话就会相互杂糅不稳定,过大又会臃肿不灵活。因此设计粒度必须是可控范围内的最小值,这个可控范围就是进程,而且必须有一个统一的实体来控制粒度,比如unix/linux中将很多东西往进程的意义上靠拢,因此进程就是unix/linux的中心。下面看看我实现单例的方式吧:
#include
int check( char * name )
{

你可能感兴趣的:(linux,windows,shell,cmd,null,FP)