linux系統編程之檔案與I/O(一):檔案的開啟關閉

來源:互聯網
上載者:User

一、檔案描述符

對於Linux而言,所有對裝置或檔案的操作都是通過檔案描述符進行的。當開啟或者建立一個檔案的時候,核心向進程返回一個檔案描述符(非負整數)。後續對檔案的操作只需通過該檔案描述符,核心記錄有關這個開啟檔案的資訊(file結構體)。
一個進程啟動時,預設開啟了3個檔案,標準輸入、標準輸出、標準錯誤,對應檔案描述符是0(STDIN_FILENO)、1(STDOUT_FILENO)、2(STDERR_FILENO),這些常量定義在unistd.h標頭檔中。


fileno:將檔案指標轉換為檔案描述符
fdopen:將檔案描述符轉換為檔案指標


二、什麼是I/O

輸入/輸出是主存和外部裝置之間拷貝資料的過程
裝置->記憶體 (輸入操作)
記憶體->裝置 (輸出操作)
進階I/O
ANSI C提供的標準I/O庫稱為進階I/O,通常也稱為帶緩衝的I/O
低級I/O
通常也稱為不帶緩衝的I/O


三、檔案的開啟關閉

open系統調用1:

函數原型
int open(const char *path, int flags);
參數
path :檔案的名稱,可以包含(絕對和相對)路徑
flags:檔案開啟模式
傳回值:
開啟成功,返迴文件描述符;開啟失敗,返回-1


open系統調用2:

函數原型
int open(const char *path, int flags,mode_t mode);
參數
path :檔案的名稱,可以包含(絕對和相對)路徑
flags:檔案開啟模式
mode:  用來規定對該檔案的所有者,檔案的使用者組及系 統中其他使用者的存取權限
傳回值:
開啟成功,返迴文件描述符;開啟失敗,返回-1


開啟檔案的方式:

O_RDONLY 開啟一個供讀取的檔案
O_WRONLY 開啟一個供寫入的檔案
O_RDWR 開啟一個可供讀寫的檔案
O_APPEND 寫入的所有資料將被追加到檔案的末尾
O_CREAT 開啟檔案,如果檔案不存在則建立檔案
O_EXCL 如果已經置O_CREAT且檔案存在,則強制open() 失敗
O_TRUNC 在open() 時,將檔案的內容清空


存取權限:

S_IRUSR 檔案所有者的讀許可權位
S_IWUSR 檔案所有者的寫入權限位
S_IXUSR 檔案所有者的執行許可權位
S_IRWXU S_IRUSR | S_IWUSR | S_IXUSR
S_IRGRP 檔案使用者組的讀許可權位
S_IWGRP 檔案使用者組的寫入權限位
S_IXGRP 檔案使用者組的執行許可權位
S_IRWXG S_IRGRP | S_IWGRP | S_IXGRP
S_IROTH 檔案其他使用者的讀許可權位
S_IWOTH 檔案其他使用者的寫入權限位
S_IXOTH 檔案其他使用者的執行許可權位
S_IRWXO S_IROTH | S_IWOTH | S_IXOTH


為了重新利用檔案描述符,用close()系統調用釋放開啟的檔案描述符 
函數原型:int close(int fd);
函數參數:
fd :要關閉的檔案的檔案描述符
傳回值:
如果出現錯誤,返回-1;調用成功返回0


樣本程式如下:

 C++ Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
/*************************************************************************
    > File Name: file_oper.c
    > Author: Simba
    > Mail: dameng34@163.com
    > Created Time: Sat 23 Feb 2013 02:34:02 PM CST
 ************************************************************************/
#include<sys/types.h>
#include<sys/stat.h>
#include<unistd.h>
#include<fcntl.h>
#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
#include<string.h>

// #define ERR_EXIT(m) (perror(m), exit(EXIT_FAILURE))
#define ERR_EXIT(m) \
    do { \
        perror(m); \
        exit(EXIT_FAILURE); \
    } while(0)

/* fileno:將檔案指標轉換為檔案描述符
 * fdopen:將檔案描述符轉換為檔案指標
 */
int main(void)
{
    printf("fileno(stdin) = %d\n", fileno(stdin));

    int fd;
    /*  fd = open("test.txt", O_RDONLY);

        if (fd == -1) {
            // perror("open error");
            fprintf(stderr, "open error with errno=%d:%s\n", errno, strerror(errno));
            exit(EXIT_FAILURE);
        }
    */
    /*
        if (fd == -1)
            ERR_EXIT("open error");
        printf("open success.\n");
    */
    umask(0); //不繼承shell的umask值,重新設定為0; newmode = mode & ~umask
    fd = open("test.txt", O_WRONLY | O_CREAT, 0666);
    if (fd == -1)
        ERR_EXIT("open error");
    printf("open success.\n");
    close(fd);

    return 0;
}


輸出為:

fileno(stdin) = 0
open success.


需要說明的是,在linux系統編程中使用的一些系統調用函數一般如果失敗返回-1且會置全域變數errno為特定的錯誤碼,可以使用perror列印,或者通過strerror(errno)列印錯誤提示。

參考:《APUE》

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.