1. fwrite fread多線程操作
可以使用文件鎖定,對文件的讀寫進行鎖定,通過系統調用fcntl( )實現,它的定義如物滾下:
int fcntl(int fildes, int command, struct flock *flock_structure);
其中:
fildes是文件描襲困述符;
command有三個:F_GETLK、F_SETLK、F_SETLKW
flock結構體包含以下成員:
short l_type
short l_whence
off_t l_start
off_t l_len
pid_t l_pid
注意:對文件區域加鎖之後,必須使用底層的read、write調用來訪問文件中的數據,因為fwrite、fread對數據的讀寫會進行緩存,可能會引起數據的問題。
=============================================
具體用法搜一罩禪余搜吧,希望有所幫助。
找了一段,大致涉及到了您的問題:
一、socket的模式
socket一般有兩種模式:同步和非同步(windows網路編程技術中也可叫鎖定和非鎖定,Linux網路編程叫阻塞和非阻塞)。
二、socket的類型
socket一般有三種類型,基於TCP的流式套接字,基於UDP的數據報套接字和原始套接字。
三、socket的IO模型
socket
的IO模型是編程中使用socket兩種模式的策略,它們適用的場合不同,在不同的操作系統上支持的模型也不同,例如windows從NT版本才開始支持
完成埠模型。Linux和Windows所支持的模型也有區別,當然也有相同的地方,可能叫法不一樣,但大致思路是一樣的,下面分別介紹windows
和Linux的IO模型
1、 Windows下的套接字IO模型:
A、 Select(選擇)模型
用於同步socket的狀態檢測模型,又叫(Linux)多路復用,可以同時檢測多個socket的狀態
B、 WSAAsyncSelect(非同步選擇)模型
用於非同步socket的非同步事件設置,它是基於Windows消息的模型,必須先打開一個窗口,然後把窗口和socket的消息綁定,這樣,在socket有消息通知時,操作系統便通知窗口,然後在窗口進行處理。
C、 WSAEventSelect(非同步事件)模型
用
於非同步socket的非同步事件,它是基於網路事件的模型,先使用CreateEvent創建一個事件,然後使用WSAEventSelect進行事件綁
定,然後可以使用WaitForMultipleObject(Event)進行事件監聽,可以同時監聽多個事件,不光是socket的,比如可以監聽使
用CreateWaitableTimer創建的Timer等。
D、 重疊IO模型
用
於非同步socket,在創建socket時需要在創建函數WSASocket中使用WSA_FLAG_OVERLAPPED標志,然後在投遞IO請求的時
候將一個Overlapped結構體指針賦給投遞函數,可以使用WSAWaitForMultipleObject來監聽事件,然後使用
WSAGetOverlappedResult來獲取IO的狀態,也可以在Overlapped結構體中使用完成常式來處理,即在投遞函數中把完成常式賦
給投遞函數。
E、 完成埠模型
它
是迄今為止最復雜的一種IO模型,當應用程序需要管理眾多的套接字並且希望隨著系統內安裝的CPU數目的增多,應用程序的性能也可以線性增加,就可以使用
這種模型,它的原理是每個CPU可以單獨負責一個線程的執行,避免線程的頻繁切換。使用這種模型往往可以達到最佳的系統性能。
首
先需要使用CreateIOCompletePort來創建完成埠,然後將IO句柄和此埠綁定,綁定也是使用此函數,當然也可以一次完成。接著是創建
工作者線程,工作者線程會使用GetQueuedCompletionStatus進入完成埠維護的線程池,當有完成事件時,會激活一個線程。
2、 Linux下的IO模型
A、阻塞IO
B、非阻塞IO
C、IO多路復用(選擇)
D、信號驅動
用於非同步socket,首先設定信號處理函數,然後使用fcntl函數設定socket的擁有者,像windows下使用WSAAsncSelect設定socket的窗口一樣。使用這種模型,當內核操作可以被操作的時候通知我們的應用程序
E、非同步IO
當內核在所有操作完成後才會通知應用程序
四、socket的一些使用上的優化
A、緩沖區的優化,可以考慮讓應用程序使用比較小的緩沖區,但同時使用多個WSARecv
B、使用socket選項SO_SNDBUF和SO_RCVBUF設置socket緩沖區大小,如果設為0,操作體系統會使用應用程序的緩沖區,這樣避免了從系統緩沖區向用戶區復制的開銷
五、注意這些IO模型有些不光是針對socket的,其他的IO操作也可以使用,最常用使用的是WriteFile,ReadFile等函數。
其它查考網址:
http://blog.163.com/tianle_han/blog/static/6617826200821522743948/
http://blog.csdn.net/yibulianhua/article/details/5374317
3. 操作系統,linux中 lockf(1,1,0);和 lockf(1,0,0); 是什麼作用
ockf(fd,1,0)是給fd文件上鎖,lockf(fd,0,0)是解鎖,配合使用,實現進程的互斥。
頭文件
#include <sys/file.h>
函數:
int lockf(int fd, int cmd, off_t len);
fd -- 文件id.
fcntl(2)的介面(inteface)函數
返回1表示調用lockf成功.
lockf用於鎖定或打開鎖定一個共享文件.
操作有:
F_LOCK(鎖定),F_TLOCK,F_ULOCK(打開鎖定),F_TEST
注意事項
lockf()函數允許將文件區域用作信號量(監視鎖),或用於控制對鎖定進程的訪問(強制模式記錄鎖定)。試圖訪問已鎖定資源的其他進程將返回錯誤或進入休眠狀態,直到資源解除鎖定為止。當關閉文件時,將釋放進程的所有鎖定,即使進程仍然有打開的文件。當進程終止時,將釋放進程保留的所有鎖定。
函數聲明:
/* 'lockf' is a simpler interface to the locking facilities of 'fcntl'. LEN is always relative to the current file position. The CMD argument is one of the following. This function is a cancellation point and therefore not marked with __THROW. */
#include <unistd.h>
int lockf(int fd, int cmd, off_t len);