讓程式單例執行的另一種方法 i8320

2021-08-25 12:39:51 字數 2363 閱讀 3003

eric在blog上發過一種方法。也已經封裝得很好了。

因為我沒有去了解dbus的用法,所以看不懂。

我是通過檔案鎖的方法實現程式單例執行。這也是linux下的實現單例守護程序的常用辦法。

下面是singleinstance標頭檔案內容。#ifndef _single_instance_h__

#define _single_instance_h__

#include

#include

#include

#include

#include

#include

#include

#include

//定義鎖檔案。 把程序的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);

}

Ojective c 單例模式的另一種

單例模式的意思就是只有乙個例項。單例模式確保某乙個類只有乙個例項,而且自行例項化並向整個系統提供這個例項。這個類稱為單例類。1.單例模式的要點 顯然單例模式的要點有三個 一是某個類只能有乙個例項 二是它必須自行建立這個例項 三是它必須自行向整個系統提供這個例項。2.單例模式的優點 1.例項控制 si...

動態XtraReports的另一種方法

昨晚一下忘了,昨天在一籌莫展的情況下,有一位好心 小土豆 遠端協助,實操指導了另外一種動態xtrareports方法。因為是他幫我寫的 我就不貼了。簡單說一下方法思路。在xtrareports資料欄內加入乙個gridcontrol1,將其dock設為fill。然後還是在xtrareports的建構函...

SQL 擷取的另一種方法

有時候我們需要將如下結果集中的ids進行分割 ids 1,12,123 1 行受影響 希望得到這樣的結果 112 123 3 行受影響 之前一直用表值函式來擷取,這裡借助master.dbo.spt values表來實現 準備資料 if object id tempdb.a is notnull d...