fcntl

fcntl

fcntl是計算機中的一種函式,通過fcntl可以改變已打開的檔案性質。fcntl針對描述符提供控制。參數fd是被參數cmd操作的描述符。針對cmd的值,fcntl能夠接受第三個參數int arg。

fcntl的返回值與命令有關。如果出錯,所有命令都返回-1,如果成功則返回某個其他值。

基本介紹

  • 中文名:fcntl
  • 表頭檔案:#include <fcntl.h>
  • 函式類型: int fcntl(int fd, int cmd,...)
  • 參數fd:參數fd代表欲設定的檔案描述符
表頭檔案,函式類型,參數介紹,參數fd,參數cmd,參數lock指針,功能介紹,函式返回值,使用實例,

表頭檔案

#include <sys/types.h>
#include <unistd.h>
#include <fcntl.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 */
}

相關詞條

熱門詞條

聯絡我們