歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> 關於Linux >> linux系統編程之文件與I/O(一) 文件的打開關閉

linux系統編程之文件與I/O(一) 文件的打開關閉

日期:2017/3/3 16:24:26   编辑:關於Linux

一、文件描述符

對於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

示例程序如下:

/*************************************************************************
> File Name: file_oper.c
> Author: Simba
> Mail: [email protected]
> 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)打印錯誤提示。

Copyright © Linux教程網 All Rights Reserved