C語言中open函數

 

2010-12-15 14:52:45|  分類: C語言學習 |  標籤:open函數   |字號 訂閱

 
 
 

語法Open

  ( windowvar, windowtype {, parent } )

  參數windowvar:指定窗口變量名,Open()函數把打開窗口的引用放置到該變量中windowtype:string類型,指定要打開窗口的數據類型,該參數指定的窗口數據類型必須與windowvar參數的類型相同或是windowvar類型的後繼對象parent:可選項,指定要打開窗口的父窗口,要打開窗口成爲父窗口的子窗口,只有當要打開窗口需要成爲某個窗口的子窗口時才需要指定該參數。如果應用程序使用Open()函數打開某個子窗口或彈出窗口而又省略了該參數,那麼當前活動窗口成爲被打開窗口的父窗口返回值Integer。函數執行成功時返回1,發生錯誤時返回-1。如果任何參數的值爲NULL,Open()函數返回NULL。

C語言中open函數

  作用:打開和創建文件。

  簡述:

  #include <fcntl.h>

  int open(const char *pathname, int oflag, ... /* mode_t mode */);

  返回值:成功則返回文件描述符,否則返回 -1

  對於 open 函數來說,第三個參數(...)僅當創建新文件時(即使用了O_CREAT 時)才使用,用於指定文件的訪問權限位(access permission bits)。pathname 是待打開/創建文件的路徑名(如 C:/cpp/a.cpp);oflag 用於指定文件的打開/創建模式,這個參數可由以下常量(定義於 fcntl.h)通過邏輯或構成。

  O_RDONLY 只讀模式

  O_WRONLY 只寫模式

  O_RDWR 讀寫模式

  打開/創建文件時,至少得使用上述三個常量中的一個。以下常量是選用的:

  O_APPEND 每次寫操作都寫入文件的末尾

  O_CREAT 如果指定文件不存在,則創建這個文件

  O_EXCL 如果要創建的文件已存在,則返回 -1,並且修改 errno 的值

  O_TRUNC 如果文件存在,並且以只寫/讀寫方式打開,則清空文件全部內容(即將其長度截短爲0)

  O_NOCTTY 如果路徑名指向終端設備,不要把這個設備用作控制終端。

  O_NONBLOCK 如果路徑名指向 FIFO/塊文件/字符文件,則把文件的打開和後繼 I/O

設置爲非阻塞模式

  (nonblocking mode)

  以下三個常量同樣是選用的,它們用於同步輸入輸出

  O_DSYNC 等待物理 I/O 結束後再 write。在不影響讀取新寫入的數據的

  前提下,不等待文件屬性更新。

  O_RSYNC read 等待所有寫入同一區域的寫操作完成後再進行

  O_SYNC 等待物理 I/O 結束後再 write,包括更新文件屬性的 I/O

  open 返回的文件描述符一定是最小的未被使用的描述符。

  如果 NAME_MAX(文件名最大長度,不包括'\0')是 14,而我們想在當前目錄下創建文件名長度超過 14 字節的文件,早期的 System V 系統(如 SVR2)會截斷超出部分,只保留前 14 個字節;而由 BSD 衍生的(BSD-derived)系統會返回錯誤信息,並且把 errno 置爲 ENAMETOOLONG。

  POSIX.1 引入常量 _POSIX_NO_TRUNC 用於決定是否截斷長文件名/長路徑名。如果_POSIX_NO_TRUNC 設定爲禁止截斷,並且路徑名長度超過 PATH_MAX(包括 '\0'),或者組成路徑名的任意文件名長度超過 NAME_MAX,則返回錯誤信息,並且把 errno 置爲 ENAMETOOLONG。


編輯本段

Linux C語言中open函數


相關函數

  open(打開文件)

  相關函數

  read,write,fcntl,close,link,stat,umask,unlink,fopen

  頭文件

  #include<sys/types.h>

  #include<sys/stat.h>

  #include<fcntl.h>

  定義函數

  int open( const char * pathname, int flags);

  int open( const char * pathname,int flags, mode_t mode);

函數說明

  參數pathname 指向欲打開的文件路徑字符串。下列是參數flags 所能使用的旗標:

  O_RDONLY 以只讀方式打開文件

  O_WRONLY 以只寫方式打開文件

  O_RDWR 以可讀寫方式打開文件。

  上述三種旗標是互斥的,也就是不可同時使用,但可與下列的旗標利用OR(|)運算符組合。

  O_CREAT 若欲打開的文件不存在則自動建立該文件。

  O_EXCL 如果O_CREAT 也被設置,此指令會去檢查文件是否存在。文件若不存在則建立該文件,否則將導致打開文件錯誤。此外,若O_CREAT與O_EXCL同時設置,並且欲打開的文件爲符號連接,則會打開文件失敗。

  O_NOCTTY 如果欲打開的文件爲終端機設備時,則不會將該終端機當成進程控制終端機。

  O_TRUNC 若文件存在並且以可寫的方式打開時,此旗標會令文件長度清爲0,而原來存於該文件的 資料也會消失。

  O_APPEND 當讀寫文件時會從文件尾開始移動,也就是所寫入的數據會以附加的方式加入到文件後面。

  O_NONBLOCK 以不可阻斷的方式打開文件,也就是無論有無數據讀取或等待,都會立即返回進程之中。

  O_NDELAY 同O_NONBLOCK。

  O_SYNC 以同步的方式打開文件。

  O_NOFOLLOW 如果參數pathname 所指的文件爲一符號連接,則會令打開文件失敗。

  O_DIRECTORY 如果參數pathname 所指的文件並非爲一目錄,則會令打開文件失敗。

參數mode 組合

  此爲Linux2.2以後特有的旗標,以避免一些系統安全問題。參數mode 則有下列數種組合,只有在建立新文件時纔會生效,此外真正建文件時的權限會受到umask值所影響,因此該文件權限應該爲(mode-umaks)。

  S_IRWXU 00700 權限,代表該文件所有者具有可讀、可寫及可執行的權限。

  S_IRUSR 或S_IREAD, 00400權限,代表該文件所有者具有可讀取的權限。

  S_IWUSR 或S_IWRITE,00200 權限,代表該文件所有者具有可寫入的權限。

  S_IXUSR 或S_IEXEC, 00100 權限,代表該文件所有者具有可執行的權限。

  S_IRWXG 00070權限,代表該文件用戶組具有可讀、可寫及可執行的權限。

  S_IRGRP 00040 權限,代表該文件用戶組具有可讀的權限。

  S_IWGRP 00020權限,代表該文件用戶組具有可寫入的權限。

  S_IXGRP 00010 權限,代表該文件用戶組具有可執行的權限。

  S_IRWXO 00007權限,代表其他用戶具有可讀、可寫及可執行的權限。

  S_IROTH 00004 權限,代表其他用戶具有可讀的權限

  S_IWOTH 00002權限,代表其他用戶具有可寫入的權限。

  S_IXOTH 00001 權限,代表其他用戶具有可執行的權限。

返回值

  若所有欲覈查的權限都通過了檢查則返回0 值,表示成功,只要有一個權限被禁止則返回-1。

錯誤代碼

  EEXIST 參數pathname 所指的文件已存在,卻使用了O_CREAT和O_EXCL旗標。

  EACCESS 參數pathname所指的文件不符合所要求測試的權限。

  EROFS 欲測試寫入權限的文件存在於只讀文件系統內。

  EFAULT 參數pathname指針超出可存取內存空間。

  EINVAL 參數mode 不正確。

  ENAMETOOLONG 參數pathname太長。

  ENOTDIR 參數pathname不是目錄。

  ENOMEM 核心內存不足。

  ELOOP 參數pathname有過多符號連接問題。

  EIO I/O 存取錯誤。

附加說明

  使用access()作用戶認證方面的判斷要特別小心,例如在access()後再作open()空文件可能會造成系統安全上的問題。

  範例

  #include<unistd.h>

  #include<sys/types.h>

  #include<sys/stat.h>

  #include<fcntl.h>

  main()

  {

  int fd,size;

  char s [ ]=”Linux Programmer!\n”,buffer[80];

  fd=open(“/tmp/temp”,O_WRONLY|O_CREAT);

  write(fd,s,sizeof(s));

  close(fd);

  fd=open(“/tmp/temp”,O_RDONLY);

  size=read(fd,buffer,sizeof(buffer));

  close(fd);

  printf(“%s”,buffer);

  }

  執行

  Linux Programmer!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章