## fcntl ##
檔案描述詞操作
### 相關函數 ###
open,flock
### 表頭檔案 ###
```
#include
#include
```
### 定義函數 ###
```
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代表欲操作的指令。
有以下幾種情況:
F_DUPFD用來查找大于或等于參數arg的最小且仍未使用的檔案描述詞,并且複制參數fd的檔案描述詞。執行成功則傳回新複制的檔案描述詞。請參考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指針為flock 結構指針,定義如下
```
struct flcok
{
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 以檔案結尾為鎖定的起始位置。
### 傳回值 ###
成功則傳回0,若有錯誤則傳回-1,錯誤原因存于errno.