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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

嵌入式Linux基础学习笔记-文件IO编程-文件锁(1)

發布時間:2024/4/18 linux 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 嵌入式Linux基础学习笔记-文件IO编程-文件锁(1) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文件鎖-文件共享

  • 共享資源競爭問題的解決方法:文件鎖。
  • 文件鎖包括
    • 建議性鎖 要求每個上鎖文件的進程都要檢查是否有鎖存在,并且尊重 已有的鎖
    • 強制性鎖 由內核執行的鎖,當一個文件被上鎖進行寫入操作的時候, 內核將阻止其他任何文件對其進行讀寫操作。
  • 文件上鎖的函數
    • lockf()
      用于對文件施加建議性鎖
    • fcntl()
      不僅可以施加建議性鎖,還可以施加強制鎖。同時還能對文 件的某一記錄上鎖,也就是記錄鎖。
  • 記錄鎖可分為
    • 讀取鎖: 又稱為共享鎖,能夠使多個進程都能在文件的同一部分建立 讀取鎖。
    • 寫入鎖: 又稱為排斥鎖,在任何時刻只能有一個進程在文件的某個部 分上建立寫入鎖。
  • 注:在文件的同一部分不能同時建立讀取鎖和寫入鎖。

fcntl()函數格式

fcntl函數原型:

int fcntl(int fd, int cmd); int fcntl(int fd, int cmd, long arg); int fcntl(int fd, int cmd ,struct flock* lock);

flock結構

struct flock {short l_type; /*鎖的類型*/ off_t l_start; /*偏移量的起始位置:SEEK_SET,SEEK_CUR,SEEK_END*/ short l_whence; /*加鎖的起始偏移*/ off_t l_len; /*上鎖字節*/ pid_t l_pid; /*鎖的屬主進程ID */ }
  • flock結構變量取值

  • 上手代碼:

1. lock_set.c實現文件記錄鎖功能:
/* lock_set.c */ int lock_set(int fd, int type) {struct flock old_lock, lock;lock.l_whence = SEEK_SET;lock.l_start = 0;lock.l_len = 0;lock.l_type = type;lock.l_pid = -1;/* 判斷文件是否可以上鎖 */fcntl(fd, F_GETLK, &lock);//文件已有鎖if (lock.l_type != F_UNLCK){/* 判斷文件不能上鎖的原因 */if (lock.l_type == F_RDLCK) /* 該文件已有讀取鎖 */{printf("Read lock already set by %d\n", lock.l_pid);}else if (lock.l_type == F_WRLCK) /* 該文件已有寫入鎖 */{printf("Write lock already set by %d\n", lock.l_pid);} }/* l_type 可能已被F_GETLK修改過 */lock.l_type = type;/* 根據不同的type值進行阻塞式上鎖或解鎖 */if ((fcntl(fd, F_SETLKW, &lock)) < 0){printf("Lock failed:type = %d\n", lock.l_type);return 1;}switch(lock.l_type){case F_RDLCK:{printf("Read lock set by %d\n", getpid());}break;case F_WRLCK:{printf("Write lock set by %d\n", getpid());}break;case F_UNLCK:{printf("Release lock by %d\n", getpid());return 1;}break;default:break;}/* end of switch */return 0; }
2. 文件寫入鎖的測試用例 write_lock.c:

創建一個hello文件,之后對其上寫入鎖,鍵盤輸入任意一個字符后解除寫入鎖。

/* write_lock.c */ #include <unistd.h> #include <sys/file.h> #include <sys/types.h> #include <sys/stat.h> #include <stdio.h> #include <stdlib.h> #include "lock_set.c"int main(void) {int fd;/* 首先打開文件 */fd = open("hello",O_RDWR | O_CREAT, 0644);if(fd < 0){printf("Open file error\n");exit(1);}/* 給文件上寫入鎖 *///調用lock_set函數lock_set(fd,F_WRLCK);getchar(); //輸入任意字符/* 給文件解鎖 */lock_set(fd,F_UNLCK);getchar(); //close(fd); exit(0); }

補充筆記:關于Linux權限 Linux 系統中采用三位十進制數表示權限,如0755, 0644. ABCD A- 0, 表示十進制 B-用戶 C-組用戶 D-其他用戶--- -> 0 (no excute , no write ,no read) --x -> 1 excute, (no write, no read) -w- -> 2 write -wx -> 3 write, excute r-- -> 4 read r-x -> 5 read, excute rw- -> 6 read, write , rwx -> 7 read, write , excute0755->即用戶具有讀/寫/執行權限,組用戶和其它用戶具有讀寫權限; 0644->即用戶具有讀寫權限,組用戶和其它用戶具有只讀權限;
3. 在兩個終端上運行./write_lock,查看運行結果

4. 編寫文件讀取鎖的測試用例read_lock.c:創建一個hello文件,之后對其上讀取鎖,鍵盤輸入任意一個字符后解除讀取鎖。
/* read_lock.c */ #include <unistd.h> #include <sys/file.h> #include <sys/types.h> #include <sys/stat.h> #include <stdio.h> #include <stdlib.h> #include "lock_set.c" int main(void) {int fd;fd = open("hello",O_RDWR | O_CREAT, 0644);if(fd < 0){printf("Open file error\n");exit(1);}/* 給文件上讀取鎖 */lock_set(fd,F_RDLCK);getchar(); //輸入任意字符/* 給文件解鎖 */lock_set(fd,F_UNLCK);getchar(); //輸入任意字符close(fd);exit(0); }

實現效果:

5. 在兩個終端上運行./read_lock,查看運行結果。

6. 驗證: 如果在一個終端上運行讀取鎖程序,在另一個終端上運行寫入鎖程序,會有什么結果?


總結

以上是生活随笔為你收集整理的嵌入式Linux基础学习笔记-文件IO编程-文件锁(1)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。