C語(yǔ)言使用flock函數(shù)對(duì)文件加鎖

lock.c

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/file.h>
#include <errno.h>
#include <string.h>

#define TRUE  1
#define FALSE 0

/**
 * @brief 嘗試獲取文件鎖
 * @details 獲取文件鎖時(shí)不會(huì)阻塞進(jìn)程, 獲取不到鎖時(shí)膛壹,立即返回不會(huì)等待
 * @param fd 文件描述符
 * @return 是否成功獲取文件鎖
 *   @retval TRUE 獲取鎖成功
 *   @retval FALSE 獲取鎖失敗
 * @attention 這里只是建議性鎖誊辉,每個(gè)使用上鎖文件的進(jìn)程都要檢查是否有鎖存在嫉戚,
 * 內(nèi)核不對(duì)讀寫(xiě)操作做內(nèi)部檢查和強(qiáng)制保護(hù)
 */
int trylock_fd(int fd)
{
    if (flock(fd, LOCK_EX|LOCK_NB) == 0) {
        return TRUE;
    } else {
        return FALSE;
    }
}

/**
 * @brief 獲取鎖或等待
 * @details 獲取文件鎖時(shí)會(huì)阻塞進(jìn)程, 獲取不到鎖時(shí),一直等到獲取成功
 * @param fd 文件描述符
 * @return 是否成功獲取文件鎖
 *   @retval TRUE 獲取鎖成功
 *   @retval FALSE 獲取鎖失敗
 * @attention 這里只是建議性鎖瑰排,每個(gè)使用上鎖文件的進(jìn)程都要檢查是否有鎖存在氧吐,
 * 內(nèi)核不對(duì)讀寫(xiě)操作做內(nèi)部檢查和強(qiáng)制保護(hù)
 */
int waitlock_fd(int fd)
{
    if (flock(fd, LOCK_EX) == 0) {
        return TRUE;
    } else {
        return FALSE;
    }
}

/**
 * @brief 釋放文件鎖
 * @param fd 文件描述符
 * @return 是否成功釋放文件鎖
 *   @retval TRUE 釋放鎖成功
 *   @retval FALSE 釋放鎖失敗
 */
int unlock_fd(int fd)
{
    if (flock(fd, LOCK_UN) == 0) {
        return TRUE;
    } else {
        return FALSE;
    }
}

/**
 * @brief 主函數(shù)
 * @details 測(cè)試獲取鎖睛藻、釋放鎖的函數(shù)
 * @param argc 命令參數(shù)個(gè)數(shù)
 * @param argv 命令參數(shù)指針數(shù)組
 * @return 程序執(zhí)行成功與否
 *   @retval 0 程序執(zhí)行成功
 *   @retval 1 程序執(zhí)行失敗
 */
int main(int argc, char *argv[])
{
    int   fd;
    char *file;
    pid_t pid;

    if (argc == 2) {
        file = argv[1];
    } else {
        file = "file.lock";
    }

    pid = getpid();

    fd = open(file, O_RDWR|O_CREAT, 0666);
    if (fd < 0) {
        fprintf(stderr, "failed to open \"%s\", detail: %s(%d)\n",
                file, strerror(errno), errno);
        exit(1);
    }

    if(trylock_fd(fd)) {
        printf("file has been locked by %d. press any key to unlock\n", pid);
    } else {
        printf("waiting for lock\n");
        waitlock_fd(fd);
        printf("file has been locked by %d. press any key to unlock\n", pid);
    }
    
    getchar();
    unlock_fd(fd);
    printf("file has been unlocked by %d.\n", pid);
    close(fd);
    exit(0);
}

Makefile

CFLAGS= -Wall -O2 -g
OBJS=lock.o
lock: $(OBJS)
    gcc -o $@ $(OBJS)
clean:
    rm -rf lock $(OBJS) file.lock

編譯

# make
cc -Wall -O2 -g   -c -o lock.o lock.c
gcc -o lock lock.o

驗(yàn)證

窗口1
# ./lock 
file has been locked by 23791. press any key to unlock
<-- 1) 按任意鍵,釋放鎖
file has been unlocked by 23791.
窗口2
# ./lock 
waiting for lock
<-- 等待鎖釋放则北,1)按下任意鍵后繼續(xù)
file has been locked by 23792. press any key to unlock
<-- 2) 按任意鍵,釋放鎖
file has been unlocked by 23792.
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末痕慢,一起剝皮案震驚了整個(gè)濱河市尚揣,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌掖举,老刑警劉巖快骗,帶你破解...
    沈念sama閱讀 222,183評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異塔次,居然都是意外死亡方篮,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)励负,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)藕溅,“玉大人,你說(shuō)我怎么就攤上這事继榆〗肀恚” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,766評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵略吨,是天一觀(guān)的道長(zhǎng)集币。 經(jīng)常有香客問(wèn)我,道長(zhǎng)晋南,這世上最難降的妖魔是什么惠猿? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,854評(píng)論 1 299
  • 正文 為了忘掉前任羔砾,我火速辦了婚禮负间,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘姜凄。我一直安慰自己政溃,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布态秧。 她就那樣靜靜地躺著董虱,像睡著了一般。 火紅的嫁衣襯著肌膚如雪申鱼。 梳的紋絲不亂的頭發(fā)上愤诱,一...
    開(kāi)封第一講書(shū)人閱讀 52,457評(píng)論 1 311
  • 那天,我揣著相機(jī)與錄音捐友,去河邊找鬼淫半。 笑死,一個(gè)胖子當(dāng)著我的面吹牛匣砖,可吹牛的內(nèi)容都是我干的科吭。 我是一名探鬼主播昏滴,決...
    沈念sama閱讀 40,999評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼对人!你這毒婦竟也來(lái)了谣殊?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,914評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤牺弄,失蹤者是張志新(化名)和其女友劉穎姻几,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體势告,經(jīng)...
    沈念sama閱讀 46,465評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鲜棠,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了培慌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片豁陆。...
    茶點(diǎn)故事閱讀 40,675評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖吵护,靈堂內(nèi)的尸體忽然破棺而出盒音,到底是詐尸還是另有隱情,我是刑警寧澤馅而,帶...
    沈念sama閱讀 36,354評(píng)論 5 351
  • 正文 年R本政府宣布祥诽,位于F島的核電站,受9級(jí)特大地震影響瓮恭,放射性物質(zhì)發(fā)生泄漏雄坪。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評(píng)論 3 335
  • 文/蒙蒙 一屯蹦、第九天 我趴在偏房一處隱蔽的房頂上張望维哈。 院中可真熱鬧,春花似錦登澜、人聲如沸阔挠。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,514評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)购撼。三九已至,卻和暖如春谴仙,著一層夾襖步出監(jiān)牢的瞬間迂求,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,616評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工晃跺, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留揩局,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,091評(píng)論 3 378
  • 正文 我出身青樓哼审,卻偏偏與公主長(zhǎng)得像谐腰,于是被迫代替她去往敵國(guó)和親孕豹。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評(píng)論 2 360

推薦閱讀更多精彩內(nèi)容