• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    Linux C 后台服务程序单进程控制的实现

    介绍

    通常后台服务器程序都必须有且只有一个进程,那么如何单进程呢?

    本例子是通过flock函数对/var/run/myserver.pid记录pid文件的进行加锁

    后台服务程序单进程控制

    详细不多说,直接看代码

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h>
    #include <errno.h>
    #include <fcntl.h>
    
    #define PID_BUF_LEN  (20)
    #define RUN_PID_FILE "/var/run/myserver.pid"
    
    //服务进程单实例运行
    //返回值: 1--正在运行,0--未运行,-1--出错
    int server_is_running()
    {
      int fd = open(RUN_PID_FILE, O_WRONLY|O_CREAT);
      if(fd < 0)
      {
        printf("open run pid err(%d)! %s\n", errno, RUN_PID_FILE);
        return -1;
      }
       
      // 加锁
      // LOCK_SH 建立共享锁定。多个进程可同时对同一个文件作共享锁定。
      // LOCK_EX 建立互斥锁定。一个文件同时只有一个互斥锁定。
      if(flock(fd, LOCK_EX|LOCK_NB) == -1)
      {
        //加不上锁,则是服务正在运行,已上锁了
        printf("server is runing now! errno=%d\n", errno);
        close(fd);
        return 1;
      }
    
      // 加锁成功,证明服务没有运行
      // 文件句柄不要关,也不要解锁
      // 进程退出,自动就解锁了
      printf("myserver is not running! begin to run..... pid=%ld\n", (long)getpid());
    
      char 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));
    
      return 0;
    }
    
    int main(void)
    {
    
      //进程单实例运行检测
      if(0 != server_is_running())
      {
        printf("myserver process is running!!!!! Current process will exit !\n");
        return -1;
      }
    
      while(1)
      {
        printf("myserver doing ... \n");
        sleep(2);
      }
    
      return 0;
    }
    
    

    运行结果

    运行程序,可知进程pid是6965

    [root@lincoding singleprocess]# ./myserver 
    server is not running! begin to run..... pid=6965
    myserver doing ... 
    myserver doing ... 
    myserver doing ... 
    myserver doing ... 
    myserver doing ... 
    myserver doing ... 
    myserver doing ... 
    myserver doing ... 

    /var/run/myserver.pid 也记录此进程的pid号,ps auxf | grep myserver可知mysever进程一直运行着

    [root@lincoding singleprocess]# cat /var/run/myserver.pid 
    6965
    [root@lincoding singleprocess]# 
    [root@lincoding singleprocess]# ps auxf | grep myserver
    root   6965 0.0 0.0  3924  460 pts/0  S+  00:32  0:00 |    \_ ./myserver
    root   9976 0.0 0.0 103256  856 pts/1  S+  00:35  0:00     \_ grep myserver
    [root@lincoding singleprocess]# 
    

    此时,再运行myserver程序,这时会报错退出,因为检测到myserver程序已经在运行中,不可以起另外一个进程,从而达到了后台服务程序单进程控制

    [root@lincoding singleprocess]# ./myserver 
    server is runing now! errno=11
    myserver process is running!!!!! Current process will exit !
    

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

    上一篇:Nginx和GeoIP模块读取IP所在的地域信息方法
    下一篇:CentOS7使用yum安装PostgreSQL和PostGIS的方法
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯

    时间:9:00-21:00 (节假日不休)

    地址:江苏信息产业基地11号楼四层

    《增值电信业务经营许可证》 苏B2-20120278

    Linux C 后台服务程序单进程控制的实现 Linux,后台,服务,程序,单进程,