用open,close,read,write,ioctl,fcntl函數多了,感覺有點模糊,因爲每次使用這些函數時都實現包含了頭文件fcntl.h,錯誤地以爲這些函數都在fcntl.h中申明,然而事實不是這樣的:
首先open函數和fcntl的確是老老實實呆在fcntl.h中:
extern int fcntl(int __fd,int __cmd,...) __THROW;
extern open(__const char *__file,int __oflag,...)__THOW;
其中第三個參數是可選參數,之所以這樣寫的原因是避免gcc在編譯時對第三個參數進行類型檢查。
read、write、close卻沒有被統一存放在fcntl.h中,而是存放在了unistd.h中,這是POSIX標準的一部分.
在/usr/include裏面沒有ioctl.h,使用locate命令查找ioctl.h,除了在內核源代碼中找到外,發現ioctl函數就在/usr/include/sys/ioctl.h中被定義, 而struct flock結構的尋找費了點時間,在fcntl.h和unistd.h中都找不到這個函數的聲明,後來才發現在fcntl.h中有這樣的包含語句:
#include <bits/fcntl.h>
所以我打開了這個子fcntl.h文件,找到了struct flock結構。