Linux C 后台服务程序单进程控制的实现
介绍
通常后台服务器程序都必须有且只有一个进程,那么如何单进程呢?
本例子是通过flock函数对/var/run/myserver.pid记录pid文件的进行加锁
- 若加锁不正常,说明后台服务进程已经在运行了,这时则直接报错退出
- 若加锁成功,说明后台服务进程没有在运行,这时可以正常启用进程
后台服务程序单进程控制
详细不多说,直接看代码
#include#include #include #include #include #include #definePID_BUF_LEN(20) #defineRUN_PID_FILE"/var/run/myserver.pid" //服务进程单实例运行 //返回值:1--正在运行,0--未运行,-1--出错 intserver_is_running() { intfd=open(RUN_PID_FILE,O_WRONLY|O_CREAT); if(fd<0) { printf("openrunpiderr(%d)!%s\n",errno,RUN_PID_FILE); return-1; } //加锁 //LOCK_SH建立共享锁定。多个进程可同时对同一个文件作共享锁定。 //LOCK_EX建立互斥锁定。一个文件同时只有一个互斥锁定。 if(flock(fd,LOCK_EX|LOCK_NB)==-1) { //加不上锁,则是服务正在运行,已上锁了 printf("serverisruningnow!errno=%d\n",errno); close(fd); return1; } //加锁成功,证明服务没有运行 //文件句柄不要关,也不要解锁 //进程退出,自动就解锁了 printf("myserverisnotrunning!begintorun.....pid=%ld\n",(long)getpid()); charpid_buf[PID_BUF_LEN]={0}; snprintf(pid_buf,sizeof(pid_buf)-1,"%ld\n",(long)getpid()); //把进程pid写入到/var/run/myserver.pid文件 write(fd,pid_buf,strlen(pid_buf)); return0; } intmain(void) { //进程单实例运行检测 if(0!=server_is_running()) { printf("myserverprocessisrunning!!!!!Currentprocesswillexit!\n"); return-1; } while(1) { printf("myserverdoing...\n"); sleep(2); } return0; }
运行结果
运行程序,可知进程pid是6965
[root@lincodingsingleprocess]#./myserver serverisnotrunning!begintorun.....pid=6965 myserverdoing... myserverdoing... myserverdoing... myserverdoing... myserverdoing... myserverdoing... myserverdoing... myserverdoing...
/var/run/myserver.pid也记录此进程的pid号,psauxf|grepmyserver可知mysever进程一直运行着
[root@lincodingsingleprocess]#cat/var/run/myserver.pid 6965 [root@lincodingsingleprocess]# [root@lincodingsingleprocess]#psauxf|grepmyserver root69650.00.03924460pts/0S+00:320:00|\_./myserver root99760.00.0103256856pts/1S+00:350:00\_grepmyserver [root@lincodingsingleprocess]#
此时,再运行myserver程序,这时会报错退出,因为检测到myserver程序已经在运行中,不可以起另外一个进程,从而达到了后台服务程序单进程控制
[root@lincodingsingleprocess]#./myserver serverisruningnow!errno=11 myserverprocessisrunning!!!!!Currentprocesswillexit!
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。