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...