歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux下的文件操作函數及creat用法

Linux下的文件操作函數及creat用法

日期:2017/2/28 16:11:31   编辑:Linux教程

  編寫Linux應用程序要用到如下工具:

  (1)編譯器:GCC

  GCC是Linux平台下最重要的開發工具,它是GNU的C和C++編譯器,其基本用法為:gcc [options] [filenames]。

  我們應該使用linux-gcc。

  (2)調試器:GDB

  gdb是一個用來調試C和C++程序的強力調試器,我們能通過它進行一系列調試工作,包括設置斷點、觀查變量、單步等。

  我們應該使用linux-gdb。

  (3)Make

   GNU Make的主要工作是讀進一個文本文件,稱為makefile。這個文件記錄了哪些文件由哪些文件產生,用什麼命令來產生。Make依靠此 makefile中的信息檢查磁盤上的文件,如果目的文件的創建或修改時間比它的一個依靠文件舊的話,make就執行相應的命令,以便更新目的文件。

  Makefile中的編譯規則要相應地使用linux-版本。

  (4)代碼編輯

  可以使用傳統的vi編輯器,但最好采用emacs軟件,它具備語法高亮、版本控制等附帶功能。

  在宿主機上用上述工具完成應用程序的開發後,可以通過如下途徑將程序下載到目標板上運行:

  (1)通過串口通信協議rz將程序下載到目標板的文件系統中(感謝Linux提供了rz這樣的一個命令);

  (2)通過ftp通信協議從宿主機上的ftp目錄裡將程序下載到目標板的文件系統中;

  (3)將程序拷入U盤,在目標機上mount U盤,運行U盤中的程序;

  (4)如果目標機Linux使用NFS文件系統,則可以直接將程序拷入到宿主機相應的目錄內,在目標機Linux中可以直接使用。

  1. 文件編程

  Linux的文件操作API涉及到創建、打開、讀寫和關閉文件。

  創建

  int creat(const char *filename, mode_t mode);

  參數mode指定新建文件的存取權限, 【 Linux公社 www.Linuxidc.com 】它同umask一起決定文件的最終權限(mode&umask),其中umask代表了文件在創建時需要去掉的一些存取權限。umask可通過系統調用umask()來改變:

  int umask(int newmask);

  該調用將umask設置為newmask,然後返回舊的umask,它只影響讀、寫和執行權限。

  打開

  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 所指的文件並非為一目錄, 則

  會令打開文件失敗。此為 Linux2.2 以後特有的旗標,以避免一些系

  統安全問題。參數 mode 則有下列數種組合,只有在建立新文件時

  才會生效,此外真正建文件時的權限會受到 umask 值所影響,因此

  該文件權限應該為(mode-umaks).

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

  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 值,表示成功, 【 Linux公社 www.Linuxidc.com 】只要有 一個權限被禁止則返回-1。

  錯誤代碼:

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

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

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

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

  EINVAL 參數 mode 不正確。

  ENAMETOOLONG 參數 pathname 太長。

  ENOTDIR 參數 pathname 不是目錄。

  ENOMEM 核心內存不足。

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

  EIO I/O 存取錯誤。

  讀寫

  在文件打開以後,我們才可對文件進行讀寫了,Linux中提供文件讀寫的系統調用是read、write函數:

  int read(int fd, const void *buf, size_t length);

  int write(int fd, const void *buf, size_t length);

  其中參數buf為指向緩沖區的指針,length為緩沖區的大小(以字節為單位)。函數read()實現從文件描述符fd所指定的文件中讀取 length個字節到buf所指向的緩沖區中,返回值為實際讀取的字節數。函數write實現將把length個字節從buf指向的緩沖區中寫到文件描述符fd所指向的文件中,返回值為實際寫入的字節數。

  以O_CREAT為標志的open實際上實現了文件創建的功能,因此,下面的函數等同creat()函數:

  int open(pathname, O_CREAT | O_WRONLY | O_TRUNC, mode);

  定位

  對於隨機文件,我們可以隨機的指定位置讀寫,使用如下函數進行定位:

  int lseek(int fd, offset_t offset, int whence);

  lseek()將文件讀寫指針相對whence移動offset個字節。操作成功時,返回文件指針相對於文件頭的位置。參數whence可使用下述值:

  SEEK_SET:相對文件開頭

  SEEK_CUR:相對文件讀寫指針的當前位置

  SEEK_END:相對文件末尾

  offset可取負值,例如下述調用可將文件指針相對當前位置向前移動5個字節:

  lseek(fd, -5, SEEK_CUR);

  由於lseek函數的返回值為文件指針相對於文件頭的位置,因此下列調用的返回值就是文件的長度:

  lseek(fd, 0, SEEK_END);

  關閉

  只要調用close就可以了,其中fd是我們要關閉的文件描述符:

  int close(int fd);

  下面我們來編寫一個應用程序,在當前目錄下創建用戶可讀寫文件"example.txt",在其中寫入"Hello World",關閉文件,再次打開它,讀取其中的內容並輸出在屏幕上:

  #include

  #include

  #include

  #include

  #define LENGTH 100

  main()

  {

  int fd, len;

  char str[LENGTH];

  fd = open("hello.txt", O_CREAT | O_RDWR, S_IRUSR | S_IWUSR);

  if (fd)

  {

  write(fd, "Hello, Software Weekly", strlen("Hello, software weekly"));

  close(fd);

  }

  fd = open("hello.txt", O_RDWR);

  len = read(fd, str, LENGTH);

  str[len] = '\0';

  printf("%s\n", str);

  close(fd);

  }

Copyright © Linux教程網 All Rights Reserved