1. 程式人生 > >linux 多個使用者對一個檔案進行操作 檔案鎖和多路複用

linux 多個使用者對一個檔案進行操作 檔案鎖和多路複用

①如果多個使用者對一個檔案進行操作的時候,如何解決,考慮用檔案鎖的形式和多路複用形式;
1)檔案鎖
找到一個函式flock()對檔案進行加鎖解鎖等操作,就是在使用前對檔案進行上鎖,在使用後對檔案進行解鎖,這樣就保證只有一個使用者訪問該檔案。
flock()
表頭檔案  #include<sys/file.h> 
定義函式  int flock(int fd,int operation);
函式說明  flock()會依引數operation所指定的方式對引數fd所指的檔案做各種鎖定或解除鎖定的動作。此函式只能鎖定整個檔案,無法鎖定檔案的某一區域。
引數  operation有下列四種情況:
   LOCK_SH 建立共享鎖定。多個程序可同時對同一個檔案作共享鎖定。

    LOCK_EX 建立互斥鎖定。一個檔案同時只有一個互斥鎖定。
    LOCK_UN 解除檔案鎖定狀態。
   LOCK_NB 無法建立鎖定時,此操作可不被阻斷,馬上返回程序。通常與LOCK_SH或LOCK_EX 做OR(|)組合。
   單一檔案無法同時建立共享鎖定和互斥鎖定,而當使用dup()或fork()時檔案描述詞不會繼承此種鎖定。
   返回值  返回0表示成功,若有錯誤則返回-1,錯誤程式碼存於errno。
程式碼:
#include <stdio.h>
#include <stdlib.h>
#include <sys/file.h> 
int main(void)

{
    FILE *fp = NULL;
    int i = 20; 

    if ((fp = fopen("./file_lock.test", "r+b")) == NULL) //開啟檔案
        printf("file open error!\n");
    if (flock(fp->_fileno, LOCK_EX) != 0) //給該檔案加鎖
        printf("file lock by others\n");
    while(1) //進入迴圈,加鎖時間為20秒,列印倒計時
    {   
        printf("%d\n", i--);
        sleep(1);

        if (i == 0)
            break;
    }   
    fclose(fp); //20秒後退出,關閉檔案
    flock(fp->_fileno, LOCK_UN); //檔案解鎖
    return 0;

}



#include <stdio.h>
#include <stdlib.h>
#include <sys/file.h> 
int main(void)
{
    FILE *fp = NULL;
    int i = 0;

    if ((fp = fopen("./file_lock.test", "r+b")) == NULL) //開啟檔案
        printf("file open error!\n");
    flock(fp->_fileno, LOCK_EX); //檔案加鎖
    while(1) //進入迴圈
    {   
        printf("%d\n", i++);
        sleep(1);
    }   
    fclose(fp); //關閉檔案
    flock(fp->_fileno, LOCK_UN); //釋放檔案鎖
    return 0;

}


首先執行file1.c,緊接著執行file2.c(執行file1.c後20秒內要執行file2.c否則看不到現象)
現象是:file1.c執行起來以後,開始倒計時。此時執行file2.c會阻塞在加鎖處。當file1.c執行20秒後關閉檔案,並釋放檔案鎖後,file2.c會開始執行。


還找到一個fcndl()的函式,作用類似。
2)多路複用

一直使用Select()或poll()函式監聽需要讀或者寫的檔案,若有檔案準備好就進行讀寫操作。這樣就可以實現多路複用。


相關推薦

linux 使用者一個檔案進行操作 檔案

①如果多個使用者對一個檔案進行操作的時候,如何解決,考慮用檔案鎖的形式和多路複用形式;1)檔案鎖找到一個函式flock()對檔案進行加鎖解鎖等操作,就是在使用前對檔案進行上鎖,在使用後對檔案進行解鎖,

Java--如何使用執行緒一個HashSet進行平行計算

這段時間工作比較忙。今天抽空整理了一個多執行緒使用場景。 當處理一個數據量比較大的集合時(每個元素的計算都耗時比較長)。由於只使用一個執行緒進行計算比較慢。所以想到多跑幾個執行緒進行處理。 1.每個執行緒可以自行計算要處理集合的開始和結束索引,確保每一個元素都被計算的到。

Flume合併一個channel上傳檔案到Hdfs

需要交流請進群-- 494831900 --我和群中朋友會及時回答 需要交流請進群-- 494831900 在tohdfs.conf 中配置如下 ----------------------------------------------------------------

Object.assign() 從一個象復制到目標

bject 待完善 示例 ces sign java script {} clas Object.assign()方法用於將所有可枚舉屬性的值從一個或多個源對象復制到目標對象。它將返回目標對象。 1、語法: Object.assign(target, ... , sourc

Elasticsearch-一個field進行值全文字搜尋

新增測試資料: POST /forum/article/_bulk { "update": { "_id": "1"} } { "doc" : {"title" : "this is java a

工程共享一個配置檔案

啟動程式: ProcessStartInfo startInfo = new ProcessStartInfo(AppDomain.CurrentDomain.BaseDirectory + "JC.Interaction.BonusControl.exe");

使用兩stack一個stack的內容進行反轉

辦法一(只採用一個stack), 通過遞迴實現: // http://w...content-available-to-author-only...s.org/reverse-a-stack-using-recursion/ #include<iostream&g

android 玩轉ContentProvider之二--實現ContentProvider張表進行操作

本人原創作品,謝絕轉載!     其它地方跟一個ContentProvider操作一張表都是一樣的,唯一區別是authority,在宣告的時候要注意,因為要宣告兩個ContentProvider,所以authority也要不一樣,否則就會因為找不到對應的ContentPr

shell遍歷文件夾並進行批量修改文件名

多個 hang img style 問題 abc 修改文件 jpg 圖片 問題:將圖片名中的ing_變為0。 當前目錄下:$ ls pic,change_name.sh pic/ |__kk1/ |__img_001.jpg

按鈕提交一個form表單

class 按鈕 控制 () ctx submit repo rep 事件 多個按鈕提交一個form表單,然後執行控制層不同的方法 在button的onclick事件下可以重寫form的action屬性 <button class="common_button" on

按鈕共用一個消息響應函數

mfc c++ 在特殊情況下,需要多個按鈕共用一個消息處理.如工具欄上的按鈕,行為都類似.可以考慮用同一個消息響應函數,來減少代碼的冗余.一、在消息映射中添加關聯的消息響應關系BEGIN_MESSAGE_MAP(CscaleweightDlg, CDialog) ... ON_CONT

python合並字典組成一個字典

ict collect -s pytho int div pre for weight from collections import ChainMapimport collectionsvalue = ChainMap()for list_num in range(1,1

shell指令碼批量檢查網站地址是否正常(親手操作Linux伺服器上)

注意:shell指令碼是以.sh結尾的檔案 1.在Linux伺服器上自己隨便找一個資料夾 [[email protected] ping]# vim ping.sh 2.進入資料夾後把一下程式碼貼上進去,然後退出並儲存 #!/bin/bash array=( http:/

spark應用yarn模式提交應用,一個Running,其它處於accepted狀態

這篇文章解決我們的問題:https://blog.csdn.net/dandykang/article/details/48160927 以前只是開發,現在到了一家大資料剛起步公司,需要提交spark應用到yarn,每次只能執行一個,處於Running狀態,其它處於Accepted狀

springboot中不同物件的屬性進行比較,將不同的值使用陣列查詢出,並儲存在意向表中

多表維護 @MethodParameter(desc="orgTenantTypeQueryAll",input="user",postType={},postName="",queryString="",httpMethod="get",userParam="user

c++檔案進行操作之建立特定的檔案結構

首先,介紹如何知道一個檔案是否存在。 //該函式可以判斷某個檔案或者資料夾相應的模式是否成立,如果成立則返回0,否則返回-1 #include<io.h> int _access(const char *path,int mode); mode可以取值為0(該檔案是否存在)、

c++檔案進行操作之遍歷雙層檔案結構

/*本程式碼實現遍歷雙層次層次的目錄結構*/ #include<stdio.h> #include<iostream> #include<io.h> #include<cstring> using namespace std; const ch

設計非本地IP之間進行TCP/UDP通訊

工作需要,遇到過一個問題,需要模擬多個非本地IP之間進行TCP/UDP通訊,一開始以為非常簡單,直到遇到錯誤“非法IP”“該請求地址無效”"指定了無效的IP地址"這些錯誤,就是本地模擬TCP/UDP時出了本地迴環地址127.0.0.1其它地址都是無法識別的,程式不知道怎麼建立套接字,也不知道傳送給誰

檔案進行操作,將所需概率求出

首先開啟檔案,遍歷檔案中的每一行,將每一行看做成列表,將列表的中的每一個元素遍歷,如果有所需的資料就記錄下來,方便以後的操作。 import math job=input("請輸入關鍵字:") addr=input("請輸入地址:") sal=float(input("請輸入薪資(萬/月

springboot程式logback日誌基本配置,包不同日誌級別輸入到檔案

日誌是程式中必不可少的內容。依據日誌我們可以有效診斷程式bug,統計使用者訪問和各主要功能的使用頻率時間段等資訊。因此我們會需要不同package使用不同的日誌級別,以及不同業務的日誌輸出到不同的檔案。下面本文簡要概述如何使用logback將不同包的不同級別日誌輸出到info1.txt中