日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

文件锁

發(fā)布時(shí)間:2025/4/5 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 文件锁 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

    • 1 文件鎖
      • 1.1 文件鎖概述
      • 1.2 示例代碼

1 文件鎖

1.1 文件鎖概述

并發(fā)對(duì)文件I/O操作的影響,解決辦法?

  • 文件鎖

用法: man 2 fcntl。

頭文件:

#include <unistd.h> #include <fcntl.h>

函數(shù)定義: int fcntl(int fd, int cmd, ... /* arg */ );

  • 參數(shù): cmd 取值 F_GETLK, F_SETLK 和 F_SETLKW ,分別表示獲取鎖、設(shè)置鎖和同步設(shè)置鎖。

文件鎖的表示:

// struct flock 結(jié)構(gòu)體說(shuō)明struct flock {short l_type; /*F_RDLCK, F_WRLCK, or F_UNLCK */off_t l_start; /*offset in bytes, relative to l_whence */short l_whence; /*SEEK_SET, SEEK_CUR, or SEEK_END */off_t l_len; /*length, in bytes; 0 means lock to EOF */pid_t l_pid; /*returned with F_GETLK */ };//l_type: 第一個(gè)成員是加鎖的類(lèi)型:只讀鎖,讀寫(xiě)鎖,或是解鎖。 //l_start和l_whence: 用來(lái)指明加鎖部分的開(kāi)始位置。 //l_len: 是加鎖的長(zhǎng)度。 //l_pid: 是加鎖進(jìn)程的進(jìn)程id。

舉例:

  • 我們現(xiàn)在需要把一個(gè)文件的前三個(gè)字節(jié)加讀鎖,則該結(jié)構(gòu)體的l_type=F_RDLCK, l_start=0, l_whence=SEEK_SET, l_len=3, l_pid不需要指定,然后調(diào)用fcntl函數(shù)時(shí),cmd參數(shù)使F_SETLK。

1.2 示例代碼

#include <unistd.h> #include <fcntl.h> #include <stdio.h> #include <stdlib.h>#define FILE_NAME "test.txt"int flock_set(int fd, int type) {printf("pid=%d into...\n", getpid());struct flock flock;memset(&flock, 0, sizeof(flock));fcntl(fd, F_GETLK, &flock);if (flock.l_type != F_UNLCK) {if (flock.l_type == F_RDLCK) {printf("flock has been set to read lock by %d\n", flock.l_pid);} else if (flock.l_type == F_WRLCK) {printf("flock has been set to write lock by %d\n", flock.l_pid);}}flock.l_type = type;flock.l_whence = SEEK_SET;flock.l_start = 0;flock.l_len = 0; flock.l_pid = -1;if (fcntl(fd, F_SETLKW, &flock) < 0) {printf("set lock failed!\n");return -1;} switch (flock.l_type) {case F_RDLCK:printf("read lock is set by %d\n", getpid());break;case F_WRLCK:printf("write lock is set by %d\n", getpid());break;case F_UNLCK:printf("lock is released by %d\n", getpid());break;default:break;}printf("pid=%d out.\n", getpid());return 0; }int main(void) {int fd;fd = open(FILE_NAME, O_RDWR|O_CREAT, 0666);if (fd < 0) {printf("open file %s failed!\n", FILE_NAME);}//flock_set(fd, F_WRLCK);flock_set(fd, F_RDLCK);getchar();flock_set(fd, F_UNLCK);getchar();close(fd);return 0; }

注意:

  • F_RDLCK, F_WRLCK,F_UNLCK只能設(shè)置其中一個(gè),不能采取或的形式進(jìn)行設(shè)置。
  • 可以被多個(gè)線(xiàn)程設(shè)置只讀鎖。
  • 如果被一個(gè)線(xiàn)程設(shè)置為只讀,另一個(gè)線(xiàn)程讀取鎖的狀態(tài)時(shí)是無(wú)法感知當(dāng)前文件被設(shè)置為只讀鎖的。
  • 總結(jié)

    以上是生活随笔為你收集整理的文件锁的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。