`
icarusli
  • 浏览: 531058 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

让程序单例运行的另一种方法[i8320]

阅读更多

eric在blog上发过一种方法。也已经封装得很好了。
因为我没有去了解dbus的用法,所以看不懂。

我是通过文件锁的方法实现程序单例执行。这也是Linux下的实现单例守护进程的常用办法。

下面是singleinstance头文件内容。#ifndef _SINGLE_INSTANCE_H__

#define _SINGLE_INSTANCE_H__

#include <stdio.h>

#include <unistd.h>

#include <stdlib.h>

#include <fcntl.h>

#include <sys/stat.h>

#include <string.h>

#include <errno.h>

#include <sys/stat.h>

//定义锁文件。 把进程的pid写入锁文件,放在/var/run目录下这是通用的方法。

#define LOCKFILE "/var/run/com.heimutuzhu.heyc.pid"

 

 

#define LOCKMODE (S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH)

 

//文件锁。

int lockfile(int fd)

{

    struct flock fl;

    fl.l_type = F_WRLCK;

    fl.l_start = 0;

    fl.l_whence = SEEK_SET;

    fl.l_len = 0;

    return(fcntl(fd, F_SETLK, &fl));

}

//检查是否运行。

int already_running(void)

{

    int fd;

    char buf[16];

    fd = open(LOCKFILE, O_RDWR|O_CREAT, LOCKMODE);

    if(fd < 0)

    {

        fprintf(stderr,"can't open %s: %s", LOCKFILE, strerror(errno));

        exit(1);

    }

    if(lockfile(fd) < 0)

    {

        if(errno == EACCES || errno == EAGAIN)

        {

            close(fd);

            return 1;

        }

        fprintf(stderr,"can't lock %s: %s", LOCKFILE, strerror(errno));

        exit(1);

    }

    ftruncate(fd, 0);

    sprintf(buf, "%ld", (long)getpid());

    write(fd, buf, strlen(buf)+1);

    return 0;

}

 

#endif
下面是使用。
通过发布  一个消息。"User.Test.Signal",通知已经起来的实例显示窗口。(参见我的 注册按键那篇)
使用这些,你只需要实现user_main即可。//这个定义自己的一个消息。

#define PUB_MSG  "com.heimutuzhu.heyc.deiconify"

static int ED_HANDLE;

int main(int argc, char *argv[])

{

    pid_t child;

    if( (child=fork()) < 0 )

    {

        g_print("error : fork() < 0 \n");

        return 1;

    }

    else if( child == 0)

    {

        if(EvtSysLibraryOpen(&ED_HANDLE)!=0)

        {

            fprintf(stderr, "Error EvtSysLibraryOpen():\n");

            return -1;

        }

        if(already_running())

        {

            EvtSysEventPublish(ED_HANDLE, "User.Test.Signal",PUB_MSG);

            EvtSysLibraryClose(ED_HANDLE);

            fprintf(stderr,"============  already_running EXIT =============\n");

            return 0;

        }

        if((EvtSysEventSubscribe(ED_HANDLE, "User.Test.Signal", NULL, __OnNotifyDeiconify,window, &ed_id))!=0)

       {

           fprintf(stderr, "Error EvtSysLibraryOpen()");

       }

       else

       {

           ED_OK = TRUE;

       }

        user_main(argc, argv);

        EvtSysLibraryClose(ED_HANDLE);

        exit(0);

    }

    printf("child pid = %d\n", child);

}
 

分享到:
评论

相关推荐

    面向对象程序设计-Java(张白一)

    这有助于保护数据免受外部的不恰当访问,同时提供了一种控制数据的方式。在Java中,我们通过定义类来实现封装,类是对象的模板,它定义了对象的属性(数据成员)和行为(方法)。 继承是面向对象的另一个关键特性,...

    java基础教程_第2部分面向对象程序设计

    继承是面向对象程序设计中的一个重要特性,它允许一个类继承另一个类的属性和方法。在Java中,继承是通过使用`extends`关键字来实现的。 1. **继承的基本概念**:继承使得子类可以继承父类的属性和行为,同时还可以...

    C#編寫的實用小程序

    5. WPF:Windows Presentation Foundation是另一种创建精美UI的方式,更现代且支持XAML。这些小程序可能展示了WPF的布局管理、数据绑定和样式设计。 6. LINQ(Language Integrated Query):C#支持集成查询语言,...

    Java语言面向对象高级程序设计

    2. **继承**:继承允许一个类(子类)继承另一个类(父类)的属性和方法,减少了代码重复,提高了代码的复用性。Java支持单继承,即一个子类只能有一个直接父类,但可以通过接口实现多继承。 3. **多态**:多态性是...

    湖南大学Java程序设计实用教程》电子教案

    10. 设计模式:在Java开发中,设计模式是一种通用的解决方案,如单例模式、工厂模式、观察者模式等,可以帮助开发者编写出更高效、可维护的代码。 通过《湖南大学Java程序设计实用教程》电子教案,学生不仅可以学习...

    HealthCheck .net 应用程序

    单例模式是项目中另一个重要的设计模式。单例模式确保一个类只有一个实例,并提供全局访问点,这样在整个应用程序生命周期中,该实例只会被创建一次,减少了资源的消耗。在HealthCheck项目中,可能有一个用于管理...

    164个完整的Java源程序代码

    Java是一种广泛使用的面向对象的编程语言,以其跨平台性、高效性和灵活性著称。这个"164个完整的Java源程序代码"集合提供了一个丰富的学习资源,涵盖了多种Java编程概念和技术。通过研究这些源代码,我们可以深入...

    最新java 程序设计

    8. NIO(非阻塞I/O):NIO提供了一种新的I/O模型,可以在等待数据读写时避免阻塞线程,提高了程序的并发性能。 五、多线程 9. 线程:Java支持多线程编程,理解线程的创建、同步、通信以及死锁的预防,是编写高效...

    Java语言程序设计.rar

    Java语言是一种广泛应用于互联网开发的高级编程语言,由Sun Microsystems(现为Oracle Corporation的一部分)于1995年推出。它的设计目标是“一次编写,到处运行”,这意味着编写好的Java程序可以在任何支持Java的...

    简单的数据打包程序 C++ 实现

    2. 数据流(I/O流):C++的I/O流库允许我们将数据从一个源(如文件)读取到内存,然后将其写入另一个目标(如另一个文件)。数据可以是文本形式,也可以是二进制形式,取决于打包的需求。 3. 文件指针与缓冲区:...

    面向对象程序设计袁绍新-实验代码

    面向对象程序设计是一种重要的编程范式,它基于“对象”的概念,强调数据和操作数据的方法紧密结合,以此构建复杂的软件系统。袁绍新等编写的《面向对象程序设计》一书,深入浅出地介绍了这一领域的核心知识。这本书...

    java语言程序设计案例教程_600it

    继承则允许一个类(子类)继承另一个类(父类)的属性和方法,实现代码复用;多态是指同一种行为可以有不同的表现形式,增强了程序的灵活性。 4. **异常处理**:Java提供了异常处理机制,通过try-catch-finally语句...

    03_现代面向对象的程序设计

    面向对象的程序设计(Object-Oriented Programming,OOP)是一种广泛应用的编程范式,它以对象为中心,通过封装、继承和多态等核心概念来组织代码,使得软件设计更加模块化,易于维护和扩展。现代面向对象的程序设计...

    JAVA程序设计高手指招(内含源程序)

    首先,我们要明确Java是一种广泛应用于各领域的面向对象的编程语言,它的跨平台特性使得开发者能够在不同的操作系统上编写和运行代码。Java的核心特性包括封装、继承和多态,这些概念在Java程序设计中起着至关重要的...

    c#小程序(很多程序源码)

    C#是一种由微软开发的面向对象的编程语言,它在.NET框架上运行,广泛应用于桌面应用、游戏开发、Web服务以及移动应用等多个领域。对于初学者来说,C#的语法简洁明了,易于理解,同时提供了强大的功能。在这个“C#小...

    java程序设计.zip

    接口则是一种规范,定义了一组方法的签名,用于实现多继承。继承则是Java中实现代码重用的重要方式,一个类可以从已有的类派生,继承其属性和方法。 在Java程序设计中,我们还需要理解控制流程结构,如条件语句(if...

    《Java面向对象程序设计》例子源代码

    4. 继承:继承允许一个类(子类)从另一个类(父类)继承属性和方法。这样,子类可以复用父类的代码,并在此基础上扩展功能。Java支持单继承,即一个子类只能有一个直接父类,但可以通过接口实现多继承的效果。 5. ...

    javai精品文章

    继承则允许一个类(子类)从另一个类(父类)继承属性和方法,提高了代码的复用性。多态是指同一种行为在不同对象上有不同的表现形式,增强了程序的灵活性。 Java的核心库提供了大量的类和接口,如集合框架...

    Java语言程序设计学习笔记

    12. **继承**:一个类继承另一个类,获取其属性和方法,实现代码复用。 13. **多态**:子类对象可以被视为父类对象,允许更灵活的编程。 14. **抽象类与接口**:抽象类用于定义通用的行为,接口则用于规范实现。 ...

    基于Java的实例源码-邮政汇款打印程序.zip

    首先,Java是一种广泛使用的面向对象的编程语言,它具有平台无关性、健壮性和安全性等特性,非常适合开发跨平台的应用程序。在这个邮政汇款打印程序中,我们可以预见到以下核心Java概念的运用: 1. **类与对象**:...

Global site tag (gtag.js) - Google Analytics