1. 程式人生 > >Linux讓程式不能被多次執行

Linux讓程式不能被多次執行

讓程式單一執行讓程式不能被多次執行: 在某些時刻,我們想讓某個程式(守護程式)只執行一次,比如一個檔案正在被使用,就不能再被開啟,有兩種辦法實現。 1.當程式執行時在某個目錄下去建立一個”奇怪“的檔案(linux一切皆檔案),然後如果當這個進行要執行,就去檢測這個檔案是否存在,如果存在,就不執行,如果不存在,再執行,當程式結束時,自動刪除掉這個檔案。 2.利用核心鎖的機制(這個後面再補充) 利用的函式 注意建立檔案的目錄。如果在根目錄下,那麼許可權可能有問題。
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <stdlib.h>


#define FILE	"/home/aston/test/aston_test_single"  //這裡的路徑就是你儲存那個標識檔案的路徑,檔名可以隨便起
void delete_file(void);

int main(void)
{
	// 程式執行之初,先去判斷檔案是否存在
	int fd = -1;
	fd = open(FILE, O_RDWR | O_TRUNC | O_CREAT | O_EXCL, 0664);
	if (fd < 0)
	{
		if (errno == EEXIST)
		{
			printf("程序已經存在,並不要重複執行\n");
			return -1;
		}
	}
	
	atexit(delete_file);			// 註冊程序清理函式
	
	int i = 0;
	for (i=0; i<10; i++)
	{
		printf("I am running...%d\n", i);
		sleep(1);
	}

	return 0;
}


void delete_file(void)
{
	remove(FILE);
}

(1)open() O_CREAT, O_EXEC(如果檔案存在則會報錯,errno會被置位,可以通過errno判斷) (2)atexit 需要在結束時清理掉建立的檔案 (3)remove 刪除檔案 程式效果如圖: 缺陷: (1)注意,如果是在根目錄下建立標識檔案(aston_test_singel)需要切換到Root許可權,否則會導致無法建立檔案從而不能實現功能 (2)注意,如果程式非正常退出,那麼不會呼叫atexit函式,那麼會導致無法自動刪除標誌檔案,那麼這世間需要手動去刪除這個檔案,否則會導致這個程式永遠無法執行。 (2)讓程式開機啟動 /etc/profile
為所有使用者配置 /etc/bash.bashrc 所有bash程序通用配置 ~/.profile 為當前使用者配置 ~/.bashrc為當前使用者配置 init.d 所有服務檔案 一、/etc/rc.local 這是一個最簡單的方法,編輯“/etc/rc.local”,把啟動程式的shell命令輸入進去即可,類似於windows下的“啟動”。 例如,每次開機時要執行一個haha.sh,這個指令碼放在/opt下面,那就可以在“/etc/rc.local”中加一行“/opt/./haha.sh”,或者兩行“cd /opt”和“./haha.sh”。