表頭檔案
#include <sys/types.h>
#include <unistd.h>
函式類型
定義
函式 int fcntl(int fd, int cmd);
int fcntl(int fd, int cmd, long arg);
int fcntl(int fd, int cmd, struct flock *lock);
fcntl()針對(檔案)描述符提供控制.參數fd 是被參數cmd操作(如下面的描述)的描述符.
針對cmd的值,fcntl能夠接受第三個參數int arg
參數介紹
參數fd
參數fd代表欲設定的檔案描述符。
參數cmd
參數cmd代表打算操作的指令。
有以下幾種情況:
F_DUPFD用來查找大於或等於參數arg的最小且仍未使用的檔案描述符,並且複製參數fd的檔案描述符。執行成功則返回新複製的檔案描述符。新描述符與fd共享同一檔案表項,但是新描述符有它自己的一套
檔案描述符標誌,其中FD_CLOEXEC檔案描述符標誌被清除。請參考
dup2()。
F_GETFD取得close-on-exec
旗標。若此旗標的FD_CLOEXEC位為0,代表在調用exec()相關函式時檔案將不會關閉。
F_SETFD 設定close-on-exec 旗標。該旗標以參數arg 的FD_CLOEXEC位決定。
F_GETFL 取得檔案描述符狀態旗標,此旗標為open()的參數flags。
F_SETFL 設定檔案描述符狀態旗標,參數arg為新旗標,但只允許O_APPEND、O_NONBLOCK和O_ASYNC位的改變,其他位的改變將不受影響。
F_GETLK 取得檔案鎖定的狀態。
F_SETLK 設定檔案鎖定的狀態。此時flcok 結構的l_type 值必須是F_RDLCK、F_WRLCK或F_UNLCK。如果無法建立鎖定,則返回-1,錯誤代碼為EACCES 或EAGAIN。
F_SETLKW F_SETLK 作用相同,但是無法建立鎖定時,此調用會一直等到鎖定動作成功為止。若在等待鎖定的過程中被信號中斷時,會立即返回-1,錯誤代碼為EINTR。
參數lock指針
參數lock指針為flock 結構指針,定義如下
struct flock
{
short int l_type;
short int l_whence;
off_t l_start;
off_t l_len;
pid_t l_pid;
};
l_type 有三種狀態:
F_RDLCK 建立一個供讀取用的鎖定
F_WRLCK 建立一個供寫入用的鎖定
F_UNLCK 刪除之前建立的鎖定
l_whence 也有三種方式:
SEEK_SET 以檔案開頭為鎖定的起始位置。
SEEK_CUR 以目前檔案讀寫位置為鎖定的起始位置
SEEK_END 以檔案結尾為鎖定的起始位置。
l_start 表示相對l_whence位置的偏移量,兩者一起確定鎖定區域的開始位置。
l_len表示鎖定區域的長度,如果為0表示從起點(由l_whence和 l_start決定的開始位置)開始直到最大可能偏移量為止。即不管在後面增加多少數據都在鎖的範圍內。
返回值 成功返回依賴於cmd的值,若有錯誤則返回-1,錯誤原因存於errno.
功能介紹
fcntl()用來操作
檔案描述符的一些特性。fcntl 不僅可以施加建議性鎖,還可以施加強制鎖。同時,fcntl還能對檔案的某一記錄進行上鎖,也就是記錄鎖。
函式返回值
fcntl的返回值與命令有關。如果出錯,所有命令都返回-1,如果成功則返回某個其他值。下列四個命令有特定返回值:F_DUPFD、F_GETFD、F_GETFL、F_GETOWN.第一個返回新的
檔案描述符,接下來的兩個返回相應標誌,最後一個返回一個正的進程ID或負的
進程組ID。
使用實例
int flags = fcntl(socket, F_GETFL, 0);
/* 設定為非阻塞*/
if (fcntl(socket_descriptor, F_SETFL, flags | O_NONBLOCK) < 0)
{
/* Handle error */
}
/* 設定為阻塞 */
if ((flags = fcntl(sock_descriptor, F_SETFL, 0)) < 0)
{
/* Handle error */
}