設備->內存(輸入操做)linux
內存->設備(輸出操做)ide
ANSI C提供的標準I/O庫稱爲高級I/O,一般也稱爲帶緩衝的I/O函數
一般也稱爲不帶緩衝的I/O測試
2. 文件描述符:fdspa
3.文件描述符與文件指針相互轉換3d
能夠經過如下兩個函數實現:指針
#include <stdio.h>code
int fileno(FILE *stream)blog
測試程序:進程
#include <stdlib.h> #include <stdio.h> int main(void) { printf("fileno(stdin) = %d\n", fileno(stdin)); printf("fileno(stdout) = %d\n", fileno(stdout)); printf("fileno(stderr) = %d\n", fileno(stderr)); return 0; }測試結果:
#include <stdio.h>
FILE *fdopen(int fd, const char *mode) //mode :r,w,r+,w+,a,a+
4.文件系統調用
有幾種方法能夠得到容許訪問文件的文件描述符。最經常使用的是使用open()(打開)系統調用
函數原型
#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);參數
path :文件的名稱,能夠包含(絕對和相對)路徑
flags:文件打開模式
mode:用來規定對該文件的全部者,文件的用戶組及系 統中其餘用戶的訪問權限
返回值
打開成功,返回文件描述符;
打開失敗,返回-1
文件打開方式:
O_EXCL表示:當O_EXCL|O_CREAT時,若文件存在,則打開失敗,不存在,則打開成功
訪問權限:
open系統調用的幾點說明:
能夠利用按位邏輯加(bitwise-OR)(|)對打開方式的標誌值進行組合。
如打開一個新文件:
#define NEWFILE (O_WRONLY|O_CREAT|O_TRUNC)
對訪問權限位進行訪問所用到的標識符,都可以經過
#include <sys/stat.h> 訪問到,一樣能夠經過|運算來對訪問權限進行組合也能夠直接給出數字表示如0655
#define MODE755 (S_IRWXU|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH)
注:文件的訪問權限是根據:umask&~mode得出來的,例如umask=0022,mode = 0655 則訪問權限爲:644
測試程序:
#include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <stdlib.h> #include <stdio.h> #include <errno.h> #include <string.h> #define ERR_EXIT(m) \ do \ { \ perror(m); \ exit(EXIT_FAILURE); \ } while(0) int main(void) { umask(0); int fd; fd = open("test.txt", O_WRONLY | O_CREAT, 0666); if (fd == -1) ERR_EXIT("open error"); printf("open succ\n"); return 0; }測試結果一:採用默認的umask值
測試結果二:從新設置umask值
爲了從新利用文件描述符,用close()系統調用釋放打開的文件描述符
函數原型:
#include <unistd.h>
int close(int fd);
函數參數:
-fd :要關閉的文件的文件描述符
返回值
若是出現錯誤,返回-1
調用成功返回0
注:若沒有顯示調用close(),當程序退出時也會關閉文件
爲了維持與早期的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);