欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品

主頁 > 知識庫 > linux系統中文件I/O教程

linux系統中文件I/O教程

熱門標簽:如何找電銷機器人 無錫真人電銷機器人供應商 電銷機器人怎么打卡 無錫ai智能語音電銷機器人廠家 濟南智能語音電銷機器人加盟 抖音商家地圖標注入駐店 易聯系統外呼營銷來回呼 河南語音電銷機器人加盟公司 江西意向度高的羿智云外呼系統

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值相同;否則表示出錯。出錯的一個常見原因是:磁盤已寫滿,或者超出了一個給定進程的文件長度限制。

實例:創建一個文件,寫入數據,移動當前偏移量,在讀數據。


復制代碼
代碼如下:

#includeunistd.h> //unistd.h>必須最早出現,因為它可能會影響到其他頭文件。#includestdio.h>
#includefcntl.h>
#includestring.h>
#includeerrno.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節點包含文件所有者、文件長度、文件所在的設備、指向文件實際數據塊在磁盤上所在位置的指針等。

打開文件的內核數據結構

如果兩個進程各自打開了同一個文件,則如圖2所示。假定第一個進程在文件描述符3打開上該文件,而另一個進程在文件描述符4上打開該文件。每個進程都得得到一個文件表項,但對一個給定的文件只有一個v節點表項。每個進程都有自己的文件表項的一個理由是:使每個進程都有自己對該問價的當前偏移量。

現在對前一節文件I/O(1)的幾個操作進一步說明:
1.  完成write之后,文件中當前偏移量即所增加的字節數。如果當前偏移量大于文件長度,則將i節點中當前文件長度設為當前文件偏移量。
2.  用O_APPEND打開一個文件,相應標志會被設置到文件狀態標識中。每次寫時,當前偏移量會被設置為i節點中的文件長度
3.  lseek定位到文件尾端時,則文件當前偏移量會被設置為當前文件長度。

可能有多個文件描述符指向同一文件表項。調用dup和fork時都能看到這一點。
多個進程讀同一文件能正確工作。但多個進程寫同一文件時,可能產生預期不到的后果??梢岳迷硬倏v避免這種情況。

原子操作
一般而言,原子操作指的是由多部組成的操作。如果該院自地執行,要么執行完所以步驟,要么一步也不執行。
1.      添加至一個文件
考慮一個進程,它要講數據添加到一個文件尾端。早期UNIX不支持open,所以可以如下實現:


復制代碼
代碼如下:

if(lseek(fd, 0L, 2)0)
err_sys(“lseekerror”);
if(write(fd, buf, 100) != 100)
err_sys(“writeerror”);

對于單個進程,這段程序能正常工作。但多個進程就不一定。結社進程A和B都對同一文件進行添加操作。每個進程都打開該文件,此時數據結構之間關系如圖2中所示。假定A調用lseek,將A的當前偏移量設置為1500。進程B執行lseek也將其當前偏移量設為1500。然后B調用write,將當前偏移量增至1600。然后內核又進行進程切換使進程A恢復運行,當A調用write時,從其當前偏移量1500處將數據寫入,將替換B剛寫入到該文件中的數據。

問題出在邏輯操作“定位到文件尾端處,然后寫“使用了兩個分開的函數調用。解決辦法是使這兩個操作成為一個原子操作。O_APPEND標識,使內核每次對文件進行寫之前,都將進程當前偏移量設置到該文件的尾端處。

2.pread和pwrite函數
原子性地定位搜索和執行I/0。


復制代碼
代碼如下:

#include unistd.h>
ssize_t pread(int fd, void *buf, size_tcount, off_t offset);
ssize_t pwrite(int fd, const void *buf,size_t count, off_t offset);
ssize_t pread(int fd, void *buf, size_tcount, off_t offset);
ssize_t pwrite(int fd, const void *buf,size_t count, off_t offset);

dup和dup2函數


復制代碼
代碼如下:

#include unistd.h>
int dup(int oldfd);
int dup2(int oldfd, int newfd);

上面兩個函數都可用來復制一個現存的文件描述符。

由dup返回的新文件描述符一定是當前可用文件描述符中的最小數值。用dup2則可以用newfd參數指定新描述符的數值。如果newfd已經打開,則先將其關閉。如果newfd等于oldfd,則dup2返回newfd而不關閉它。

圖3.3顯示了這種情況。

假定我們的進程執行了:

newfd = dup(1);

當此函數執行時,假設下一個可用的描述符是3。因為這兩個描述符指向同一個文件表項,所以他們共享文件標志以及同一文件偏移量。

sync、fsync和fdatasync


復制代碼
代碼如下:

#include unistd.h>
void sync(void);
int fsync(int fd);
int fdatasync(int fd);

當將數據寫入文件時,內核通常將數據復制到一個緩沖區,直到緩沖區寫滿,再將緩沖區排路輸出隊列,然后等待其到達隊首,才進行實際的I/O操作。這種輸出防暑被稱為延遲寫。延遲寫減少了磁盤的讀寫次數,但卻降低了文件內容的跟新速度。當系統發生故障時,延遲寫可能造成文件跟新內容的丟失。為了保證磁盤上實際文件系統與緩沖區高速緩存中內容一致性,UNIX系統提供了sync、fsync和fdatasync 三個函數。

fcntl函數


復制代碼
代碼如下:

#include unistd.h>
#include fcntl.h>
int fcntl(int fd, int cmd, ... /* arg */ );

可以改變已經打開文件的性質。

復制一個現有的描述符(cmd=F_DUPFD)
獲得或設置文件描述符(cmd=F_GETFD|F_SETFD)
獲得或設置文件狀態標志(cmd=F_GETFL|F_SETFL)
獲得或設置異步I/O所有權(cmd=F_GETOWN|F_SETOWN)
獲得或設置記錄鎖(cmd=F_GETLK|F_SETLK、F_SETLKW)

可以用fcntl函數設置文件狀態,常用設置套接字描述符為非阻塞O_NONBLOCK

ioctl函數
#include sys/ioctl.h>
int ioctl(int d, int request, ...);

提供了一個用于控制設備及其描述符行為和配置底層服務的接口。

/dev/fd
打開文件/dev/fd/n等效于復制描述符n。

標簽:保山 濱州 綏化 常德 亳州 河源 江蘇 宿州

巨人網絡通訊聲明:本文標題《linux系統中文件I/O教程》,本文關鍵詞  linux,系統,中,文件,教程,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《linux系統中文件I/O教程》相關的同類信息!
  • 本頁收集關于linux系統中文件I/O教程的相關信息資訊供網民參考!
  • 推薦文章
    欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品
  • <rt id="w000q"><acronym id="w000q"></acronym></rt>
  • <abbr id="w000q"></abbr>
    <rt id="w000q"></rt>
    日韩美女精品在线| 91麻豆6部合集magnet| av网站免费在线播放| 欧美日韩国产经典色站一区二区三区| 1000精品久久久久久久久| 国产精品影视天天线| 天天操天天摸天天舔| 国产日韩欧美高清在线| 国产一区二区精品久久| 日本人亚洲人jjzzjjz| 久久久欧美精品sm网站| 国产在线一区二区综合免费视频| 精品人妻无码一区二区三区 | 欧美精品一区二区久久婷婷| 视频一区视频二区中文| 800av在线播放| 欧美一区二区在线免费播放| 日韩成人精品在线| 99久久久久久久久久| 26uuu色噜噜精品一区| 精品一区二区免费视频| 一区二区三区在线观看免费视频| 久久网站最新地址| 国产激情偷乱视频一区二区三区| 国产一区在线观看免费| 国产精品国产三级国产aⅴ无密码| 成人毛片在线观看| 在线区一区二视频| 亚洲国产精品自拍| 日本一区二区三区网站| 26uuu国产在线精品一区二区| 黄色日韩网站视频| chinese全程对白| 亚洲人成精品久久久久| 久久无码专区国产精品s| 欧美一区二区三区思思人| 久久精品999| 手机在线免费看毛片| 一区二区高清在线| 亚洲国产第一区| 久久精品欧美一区二区三区不卡 | 国产精品18久久久久久久久| 老湿机69福利| 亚洲二区在线视频| 久久精品国产亚洲av久| 欧美高清在线视频| 成年人看片网站| 波多野结衣中文一区| 欧美日韩一二三区| 视频一区免费在线观看| 国产精品69久久久久孕妇欧美| 亚洲欧美一区二区三区孕妇| 美女又爽又黄视频毛茸茸| 欧美激情一区二区在线| 91亚洲一线产区二线产区| ww久久中文字幕| 99视频在线观看一区三区| 欧美一区二区日韩一区二区| 国产精品一品二品| 欧美视频完全免费看| 久草热8精品视频在线观看| 色婷婷综合久久久久中文| 日韩av中文字幕一区二区三区| 国产精品免费在线视频| 亚洲成人av一区| 少妇高潮一区二区三区喷水| 亚洲国产欧美一区二区三区丁香婷 | 六月丁香婷婷色狠狠久久| 国产一二三区精品| 首页国产欧美日韩丝袜| 九九热最新地址| 蜜臀av性久久久久蜜臀aⅴ流畅| 午夜爽爽爽男女免费观看| 日韩中文字幕亚洲一区二区va在线| 娇小11一12╳yⅹ╳毛片| 性久久久久久久| 国产1区2区3区4区| 久久se精品一区精品二区| 欧美三级电影网| 国产成人亚洲综合a∨婷婷| 欧美一级欧美三级在线观看| 波多野结衣在线aⅴ中文字幕不卡| 日韩欧美的一区二区| 伊人av在线播放| 国产精品久久久久精k8| 国产在线观看h| 亚洲第一精品在线| 久久久久久久久毛片| 国产综合色产在线精品| 欧美精品v国产精品v日韩精品| 成人高清视频在线观看| 久久综合久色欧美综合狠狠| 精品视频站长推荐| 亚洲女人的天堂| 婷婷久久综合网| 韩国成人精品a∨在线观看| 欧美电影一区二区| 中文字幕乱妇无码av在线| 51妺嘿嘿午夜福利| 日韩va亚洲va欧美va久久| 欧美视频一区二| 91一区在线观看| 国产精品久久久久久久蜜臀| 五月激情四射婷婷| 久久精品国产第一区二区三区| 欧美精品tushy高清| 性一交一黄一片| 亚洲日本护士毛茸茸| 老湿机69福利| 大胆亚洲人体视频| 国产欧美一区二区精品性色| 久久av无码精品人妻系列试探| 香蕉影视欧美成人| 欧美日韩国产综合视频在线观看| 91同城在线观看| 综合亚洲深深色噜噜狠狠网站| 亚洲 欧美 国产 另类| 国产一区二区在线看| 久久中文娱乐网| 中字幕一区二区三区乱码| 日本不卡高清视频| 日韩视频一区二区在线观看| 日韩 中文字幕| 日本不卡一区二区三区高清视频| 欧美一区二区免费视频| 亚洲啪av永久无码精品放毛片| 亚洲综合激情另类小说区| 欧美影视一区在线| 午夜性福利视频| 亚洲.国产.中文慕字在线| 在线观看视频一区| 91网页版在线| 夜夜嗨av一区二区三区中文字幕 | 欧美色国产精品| 韩国一区二区三区四区| 亚洲国产精品久久久久婷婷884| 欧美艳星brazzers| 农村末发育av片一区二区 | 网站免费在线观看| 免费精品视频最新在线| 2024国产精品| 天天爽天天爽天天爽| 成人av在线资源| 一区二区在线电影| 69堂精品视频| 亚洲精品国产精品国自产网站| 国产精品亚洲午夜一区二区三区| 国产午夜精品一区二区三区四区| 国产一二三av| 北条麻妃国产九九精品视频| 一区二区三区91| 日韩一区二区免费电影| 精品人妻中文无码av在线| 国产成人无遮挡在线视频| 最新热久久免费视频| 欧美喷潮久久久xxxxx| 极品白嫩丰满美女无套| 国产美女精品人人做人人爽| 国产精品成人一区二区艾草 | 在线精品视频播放| 美女一区二区在线观看| 欧美国产一区在线| 欧美亚洲禁片免费| 90岁老太婆乱淫| 成人福利视频网站| 亚洲成人av一区二区三区| 久久先锋影音av鲁色资源| 私库av在线播放| 2一3sex性hd| 国产高清不卡一区| 亚洲国产精品视频| 久久综合九色综合97婷婷女人 | 精彩视频一区二区| 亚洲丝袜美腿综合| 欧美一二三四区在线| 污污视频网站在线免费观看| 美女被艹视频网站| 伦理电影国产精品| 中文字幕一区二区三区色视频| 7777精品伊人久久久大香线蕉完整版| 国产黄色大片免费看| 亚洲一区二区三区三州| 激情文学综合丁香| 一区二区久久久久久| 久久久久久久久久久电影| 欧美日韩一区中文字幕| 日本污视频网站| 一级全黄裸体片| 国产激情视频一区二区三区欧美| 亚洲国产一二三| 国产喷白浆一区二区三区| 777欧美精品| 色综合天天综合网天天看片| 三级电影在线看| 99久久精品国产一区| 国内精品伊人久久久久影院对白| 一区二区国产盗摄色噜噜| 国产清纯白嫩初高生在线观看91 | 欧美久久婷婷综合色| 性欧美疯狂猛交69hd|