程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> linux系統編程之文件與IO(一):文件描述符、open,close

linux系統編程之文件與IO(一):文件描述符、open,close

編輯:關於C語言

  • 輸入/輸出是主存和外部設備之間拷貝數據的過程

          設備->內存(輸入操作)

           內存->設備(輸出操作)

  • 高級I/O

          ANSI C提供的標准I/O庫稱為高級I/O,通常也稱為帶緩沖的I/O

  • 低級I/O

          通常也稱為不帶緩沖的I/O

2. 文件描述符:fd

  • 對於Linux而言,所有對設備或文件的操作都是通過文件描述符進行的。
  • 當打開或者創建一個文件的時候,內核向進程返回一個文件描述符(非負整數)。後續對文件的操作只需通過該文件描述符,內核記錄有關這個打開文件的信息。
  • 一個進程啟動時,默認打開了3個文件,標准輸入、標准輸出、標准錯誤,對應文件描述符是0(STDIN_FILENO)、1(STDOUT_FILENO)、2(STDERR_FILENO),這些常量定義在unistd.h頭文件中。C庫函數中與之對應的是:stdin,stdout,stderr,不過這三個是FILE指針類型。

3.文件描述符與文件指針相互轉換

可以通過以下兩個函數實現:

  • fileno:將文件指針轉換為文件描述符

            #include <stdio.h>

            int fileno(FILE *stream)

測試程序:

#include <stdlib.h><stdio.h>

 main( 
測試結果:

測試結果一:采用默認的umask值

 QQ截圖20130710113500

測試結果二:重新設置umask值

QQ截圖20130710113508

    • close系統調用

為了重新利用文件描述符,用close()系統調用釋放打開的文件描述符

函數原型:

#include <unistd.h>

int close(int fd);

函數參數:

-fd :要關閉的文件的文件描述符

返回值

如果出現錯誤,返回-1

調用成功返回0

注:若沒有顯示調用close(),當程序退出時也會關閉文件

    • creat系統調用

為了維持與早期的UNIX系統的向後兼容性,Linux也提供可選的創建文件的系統調用,它稱為creat()。現代的linux內核很少采用creat創建文件,因為open可以完成創建功能

函數原型:

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

參數

path :文件的名稱,可以包含(絕對和相對)路徑

mode: 用來規定對該文件的所有者,文件的用戶組及系 統中其他用戶的訪問權限

返回值

打開成功,返回文件描述符;

打開失敗,返回-1

 

       在UNIX的早期版本中,open()系統調用僅僅存在兩個參數的形式。如文件不存在,它就不能打開這些文件。文件的創建則由單獨的系統調用creat()完成。在Linux及所有UNIX的近代版本中,creat()系統調用是多余的。

creat()調用

fd = creat(file, mode);

完全等價於近代的open()調用

fd = open(file, O_WRONLY | O_CREAT | O_TRUNC, mode);

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved