Linux文件I/O主要指的是文件的輸入輸出,很多初學者對文件的I/O不是很了解,Linux文件I/O的操作較多,下面小編就給大家詳細介紹下Linux文件I/O。
linux 文件I/O教程(1)
一,文件描述符
對內核而言,所以打開的文件都通過文件描述符引用。每個進程都有一些與之關聯的文件描述符。文件描述符是一個非負整數。當打開一個現有文件或創建一個新文件時,內核向進程返回一個文件描述符。當讀或寫一個文件時,使用open或creat返回的文件描述符標識該文件,將其作為參數傳送給read和write。
一般有三個以及打開的文件描述符,他們是:
代碼如下:
0:標准輸入 STDIN_FILENO
1:標准輸出 STDOUT_FILENO
2標准錯誤輸出 STDERR_FILENO
每行後面的符號常量是依從POSIX而定的。
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);
pathname是要打開或創建文件的名字。
flag用來定義打開文件所采取的的動作,必須調用以下模式之一
O_RDONLY, O_WRONLY, O_RDWR分別代表只讀,只寫,讀寫方式打開。
open還可以包括以下可選模式的組合
O_APPEND:把寫入數據追加到文件的尾端
O_CREAT:若文件不存在,則創建它。使用此選項時,需要第三個參數mode,用其指定該新文件的訪問權限。
O_EXCL:如果同時指定了O_CREAT,而文件存在,則會出錯。用此可以測試一個文件是否存在,如果存在,則創建文件,這使測試和創建兩者成為一個原子操作。
O_TRUNC: 如果此文件存在,而且為只寫或讀寫成功打開,則將其長度截為0。
open返回的文件描述符一定是最小的未用描述符數值。這一點被某些應用程序用在標准輸入,標准輸出或標准錯誤輸出上。如,一個程序關閉了自己的標准輸出,然後再次調用open,文件描述符1就會被調用,並且標准輸出將被有效的重定向到另一個文件或設備。
POSIX規范還標准化了一個creat調用,此函數等效於
open(pathname,O_WONLY |O_CREAT | O_TRUNC, mode);
close函數
#include 《unistd.h》
int close(int fd);
close調用終止一個文件描述符fd與對應文件之間的關聯。文件描述符被釋放後並能重新使用。close調用成功返回0,出錯返回-1.
關閉一個文件時會釋放該進程加在文件上的所有記錄鎖。當一個進程終止時,內核自動關閉它所有打開的文件。
lseek函數
每個打開的文件都有一個與其相關聯的”當前文件偏移量”。按系統默認情況,當打開一個文件時,除非指定O_APPEND選項,否則該偏移量被設置為0。lseek可以為一個打開的文件設置偏移量。
代碼如下:
#include 《sys/types.h》
#include 《unistd.h》
off_t lseek(int fd, off_t offset, intwhence);
offset用來指定位置,whence參數定義該偏移值的用法。whence可取以下值:
代碼如下:
SEEK_SET: The offset is set to offset bytes.
SEEK_CUR: The offset is set to its current locationplus offset bytes.
SEEK_END: The offset is set to the size of the fileplus offset bytes.
成功調用返回從文件頭到文件指針被設置處的字節偏移值,失敗返回-1。參數offset定義在《sys/types.h》中。
當偏移量大於文件長度時,出現空洞,空洞不占用存儲區。
read函數
代碼如下:
#include 《unistd.h》
ssize_t read(int fd, void *buf, size_tcount);
將與文件描述符fd關聯的文件中讀入count個字符放到buf中。返回讀入的字節數,它可能小於請求的字節數。如果read調用返回0,就表示未讀入任何數據,已到達了文件尾。返回-1,就表示出錯。
write函數
代碼如下:
#include 《unistd.h》
ssize_t write(int fd, const void *buf,size_t count);
把緩沖區buf的前count個字節寫入與文件描述符fd相關聯的文件中。返回實際寫入的字節數,通常與count值相同;否則表示出錯。出錯的一個常見原因是:磁盤已寫滿,或者超出了一個給定進程的文件長度限制。
實例:創建一個文件,寫入數據,移動當前偏移量,在讀數據。
上一頁123下一頁共3頁
代碼如下:
#include《unistd.h》 //《unistd.h》必須最早出現,因為它可能會影響到其他頭文件。#include《stdio.h》
#include《fcntl.h》
#include《string.h》
#include《errno.h》
int main()
{
char* filename = “。//file”;
char buf[100];
char buf1[5];
int fd;
printf(“open a file to write\n”);
if((fd = open(filename,O_RDWR|O_CREAT|O_TRUNC,S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH ))==-1)
{
perror(“cannot open file\n”);
return 1;
}
printf(“open file successfully!\n”);
printf(“input a string:”);
gets(buf);
//write intofile
if(write(fd,buf,strlen(buf)) !=strlen(buf))
{
perror(“cannot write intofile\n”);
return 1;
}
close(fd);
printf(“open file to read.\n”);
if((fd=open(filename,O_RDONLY)) == -1)
{
perror(“cannot open thefile.\n”);
return 1;
}
if(lseek(fd,3,SEEK_SET) == -1)
{
perror(“lseek erroe\n”);
return 1;
}
//read from the file
if(read(fd,buf1,4)==-1)
{
perror(“read error.\n”);
return 1;
}
printf(“read from file is%s\n”,buf1);
close(fd);
return 0;
}
執行與輸出結果:
代碼如下:
root@jb51:~$gcc -o io io.c
root@jb51:~$./io
open a file towrite
open filesuccessfully!
input a string:akxivbaslzkncxcasbxbwwvaidxbd
open file toread.
read from fileis ivba
linux 文件I/O教程(2)
下面介紹了linux中有關文件I/O的相關內容,內核使用三種數據結構表示打開的文件,他們之間的關系決定了在文件共享方面一個進程對另一個進程可能產生的影響。
一,文件共享
內核使用三種數據結構表示打開的文件,他們之間的關系決定了在文件共享方面一個進程對另一個進程可能產生的影響。
1) 每個進程在進程表中都有一個記錄項,記錄項中包含一張打開文件描述表,可將其視為一個矢量,每個描述符占用一項。與每個文件描述符相關聯的是:
a) 文件描述符標志
b) 指向一個文件表項的指針
2) 內核為所有打開文件維持一張文件表。每個文件表項包含:
a) 文件狀態標志(讀、寫、讀寫、添些、同步和阻塞等)
b) 當前文件偏移量
c) 指向文件v節點表項的指針
3) 每個打開文件(或設備)都有一個v節點(v-node)結構。v節點包含了文件類型和對比文件進行各種操作的函數的指針。對於大多數文件,v節點還包含了該文件的i節點。i節點包含文件所有者、文件長度、文件所在的設備、指向文件實際數據塊在磁盤上所在位置的指針等。
打開文件的內核數據結構