from:
1. 在建立的檔案中寫入程序的id,如果機器非正常退出,重啟後先讀取這個檔案,得到程序id,再根據id判定程序是否正在執行,如果不是,則把檔案刪除掉。這樣就不會發生不刪除檔案,程式執行不起來的問題了。
2. 開啟乙個檔案,然後鎖定,新執行的程式會試圖再次鎖定該檔案,但是因為已經被鎖定,所以會返回錯誤資訊。據此就可以判斷是否有程式已經執行。設定fd_cloexec後,只要程式終止,都可以再次鎖定。
通常精靈程序都使用這種方法,比如apache等等,而且預設都會在/var/run目錄
qt**
#define write_lock(fd,offset,whence,len) lock_reg(fd,f_setlk,f_wrlck,offset,whence,len)
#define file_mode (s_irwxu|s_irwxg|s_irwxo)
int lock_reg (int fd, int cmd, int type, off_t offset, int whence, off_t len)
bool issingleton()
if(write_lock(fd, 0, seek_set, 0) < 0)
if (ftruncate(fd, 0) < 0)
sprintf(buf,"%d\n",getpid());
if (write(fd, buf, strlen(buf)) != strlen(buf))
// close file descriptor
if ((val = fcntl(fd, f_getfd, 0)) < 0)
val |= fd_cloexec;
if (fcntl(fd, f_setfd, val) < 0)
return true;
} void initdaemon(void)
/* change working directory */
if ((chdir("/")) < 0)
umask(0); /* clear file mode creation mask */
#if 0
close(0); /* close stdin */
close(1); /* close stdout */
close(2); /* close stderr */
#endif
} int main(int argc, char *argv)
3. 遍歷/proc目錄下的程序資訊,如果應用程式對應的程序存在,則讓認為應用程式已經在執行。然後強制關閉該應用程式,用新的命令列引數重新執行它。這樣做的優點是實現簡單,到達了我們預期的目標。缺點是強制kill第乙個執行例項太野蠻,可能會造成資料丟失,另外建立新程序的開銷會讓使用者感覺反應遲鈍。
c**
/*
* getpid shell: pidof ***
* returns the executable name for given pid.
*/
static gchar *
pid_to_binary_name (gint pid)
fclose (fcmd);
} return null;
}
4. 通過視窗管理器實現,根據應用程式的視窗判斷應用程式是否在執行。如果發現對應的應用程式已經在執行,把對應的視窗提到前面來。這要修改應用程式才行,只有應用程式自己才知道其擁有的視窗的關係,若不加考慮把應用程式的主視窗提到前面來,這也並不見得合適。這種方法只能解決前兩個小問題,命令列引數還是無法傳遞給第乙個執行例項。
5. 應用程式提供乙個dbus服務物件,第乙個執行例項作為伺服器執行,第二個執行例項作為客戶端執行,第二個執行例項把命令列引數傳遞給第乙個執行例項,然後就退出。第乙個執行例項接受到新的命令列引數,作相應的處理,比如,把相應的視窗提到前面來,根據命令列引數進行處理。這是第二種方法的改進,可以實現全部的功能,缺點是要修改應用程式,不過dbus服務物件可以通過乙個公共庫來實現,應用程式的改動並不大。
6. 使用訊號量
訊號量知識:
訊號量例項:
c**
#include#include#include#include#include#include#include#include#define n 3
pthread_mutex_t mutex_w,mutex_r; // 定義讀寫互斥鎖
sem_t sem_w,sem_r; //定義讀寫訊號量
int data[n];
int pos=0;
void *function_w(void *arg)
return (void *)0;
} void *function_r(void *arg)
return (void *)0;
} int main(int argc, char **argv)
} for(i=n;i<2*n;i++)
} sleep(1);
return(0);
}
7. 繫結某乙個socket埠, 下次執行就無法再次繫結而退出. 判斷程式是否已經執行
近段時間,需要寫乙個小功能,就是需要判斷程式是否已經執行。某個程式安裝後,也許被多個使用者執行。那怎樣判斷當前使用者已經執行了此程式了呢?下面是insus.net的做法,就是 vb.net winform獲取執行程式使用者名稱 然後 winform vb.net 獲取當前登入的使用者名稱 從上面的方...
判斷程式是否執行
unit urunexefile inte ce uses windows,messages,sysutils,classes,graphics,controls,forms,dialogs,stdctrls,tlhelp32 type tform1 class tform button2 tbut...
判斷程式是否在執行
using system using system.collections.generic using system.windows.forms using system.diagnostics using system.collections namespace dataupper string ...