判斷程式例項是否已經執行的N種方法

2021-06-07 08:36:25 字數 2642 閱讀 1357

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