zoukankan      html  css  js  c++  java
  • Linux-让程序不能多次运行

    1、因为守护进程是长时间运行而不退出的,因此./a.out执行一次就有一个进程,执行多次就有多个进程。

    2、这样并不是我们想要的。我们的守护进程一般都是服务器,服务器程序只要运行一个就够了,多次同时运行并没有意义甚至会带来错误。

    3、因此我们希望我们的程序具有一个单例运行的功能。意思就是说当我们./a.out去运行一个程序时,如果当前还没有这个程序的进程运行则运行之,如果之前已经有一个这个程序的进程在运行则本次运行直接退出(提示程序已经在运行)。

    4、实现方法:

    (1)、最常用的一种方法就是:用一个文件的存在与否来做标志。具体做法是程序在执行之初去判断一个特定的文件是否存在,若存在则表明进程已经在运行,若不存在则表明进程没有在运行。然后运行这个程序时去创建这个文件。当程序结束的时候去删除这个文件即可。

    (2)、这个特定文件要古怪一点,确保不会凑巧真的在电脑中存在的。

     1 #include <stdio.h>
     2 #include <error.h>
     3 #include <stdlib.h>
     4 #include <sys/types.h>
     5 #include <sys/stat.h>
     6 #include <fcntl.h>
     7 
     8 #define FILE     "/var/linux_text_single"//定义一个文件
     9 
    10 void delete_file(void);
    11 
    12 int main(void)
    13 {
    14     //程序运行之初,先判断文件是否存在
    15     int fd = -1;
    16     fd = open(FILE, O_RDWR | O_TRUNC | O_CREAT | O_EXCL,0664);
    17     if(fd < 0)
    18     {
    19         if(errno == EEXIST)
    20         {
    21             printf("错误是文件已经存在");
    22             return -1;
    23         }
    24     }
    25     printf("打开成功");
    26     atexit(delete_file);//注册进程清理函数,这个函数就会在return 0 (程序终止的时候)的时候自动执行 
    27     int i = 0;
    28     for(i = 0; i < 10; i++)
    29     {
    30         printf("i am running ,%d
    ",i);
    31         sleep(1);
    32     }
    33 }
    34 void delete_file(void)
    35 {
    36     remove(FILE);
    37 }
  • 相关阅读:
    C#通信学习(一)
    ms sql server 大批量导入
    PostgreSQL
    服务器性能指标有哪些
    C#一些需要注意的点(中级)
    JSON.parse与eval区别
    NDK编程中如何在C文件中打印调试信息
    Stack switching mechanism in a computer system
    Weex 相关文章收集
    JavaScript HTML DOM 元素(节点)
  • 原文地址:https://www.cnblogs.com/jiangtongxue/p/11270843.html
Copyright © 2011-2022 走看看