介绍通常后台服务程序必须有一个且只能有一个进程,那么如何单进程呢?本例使用flock函数锁定/var/run/myserver.pid记录的pid文件。如果锁不正常,说明后台服务进程已经在运行。这时候会直接报错退出。如果加锁成功,说明后台服务进程没有运行。此时可以正常启用进程。后台服务程序单进程控制详细不多说,直接看代码#include#include#include#include#include#include#definePID_BUF_LEN(20)#defineRUN_PID_FILE"/var/run/myserver.pid"//服务进程单实例运行//返回值:1--Running,0--Not正在运行,-1-错误intserver_is_running(){intfd=open(RUN_PID_FILE,O_WRONLY|O_CREAT);if(fd<0){printf("打开运行piderr(%d)!%s\n",errno,RUN_PID_FILE);返回-1;}//lock//LOCK_SH建立共享锁。多个进程可以同时共享同一个文件的锁。//LOCK_EX建立互斥锁。一个文件同时只有一个独占锁。if(flock(fd,LOCK_EX|LOCK_NB)==-1){//如果不能加锁,则服务正在运行,已被锁定printf("serverisrunningnow!errno=%d\n",errno);关闭(fd);返回1;}//加锁成功,证明服务没有运行//不要关闭或解锁文件句柄//当进程退出时,会自动解锁printf("myserverisnotrunning!begintorun.....pid=%ld\n",(long)getpid());字符pid_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("myserver进程正在运行!!!!!!当前进程将退出!\n");返回-1;}while(1){printf("myserverdoing...\n");睡觉(2);}return0;}运行结果运行程序,我们可以看到进程pid为6965[root@lincodingsingleprocess]#./myserverserverisnotrunning!开始运行.....pid=6965myserverdoing...myserverdoing...myserverdoing...myserverdoing...myserverdoing...myserverdoing...myserverdoing...myserverdoing.../var/run/myserver.pid也记录了这个进程的pid号,psauxf|grepmyserver显示myserver进程一直在运行[root@lincodingsingleprocess]#cat/var/run/myserver.pid6965[root@lincodingsingleprocess]#[root@lincodingsingleprocess]#psauxf|grepmyserverroot69650.00.03924460点/0S+00:320:00|\_./myserverroot99760.00.0103256856pts/1S+00:350:00\_grepmyserver[root@lincodingsingleprocess]#此时再次运行myserver程序,会报错退出,因为检测到myserver程序在运行期间,无法启动另一个进程,从而实现后台服务程序的单进程控制[root@lincodingsingleprocess]#./myserverserverisrunningnow!errno=11myserver进程正在运行!!!!!!当前进程将退出!