2011-4-7
一.文件I/O編程
1.不帶緩存的文件IO操作
1.基本操作
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
Open
Fd=open(“/tmp/hello.c”,O_WRONLY |O_CREAT,0600);
Close
Close(fd);
Read
Read(fd,buf,len)
Write
Write(fd,buf,len)
Lseek
Off_t lseek(int fd,off_t ,int whence)
Whence
SEEK_SET SEEK_CUR SEEK_END
Lseek(fd,0,SEEK_SET)文件指針移到文件起始位置
2.文件鎖
Fcntl
Fcntl(int fd, int cmd, struct flock *lock)
Cmd F_SETLK F_GETLK
Lock具體結構略,
說明鎖的類型,有
F_RDLCK 讀取鎖(共享鎖,可共享)
F_WRLCK 寫入鎖(互斥鎖)
F_UNLCK 解鎖
Fcntl(fd,F_RDLCK,&lock);
Fcntl(fd,F_WRLCK,&lock);
Fcntl(fd,F_UNLCK,&lock);
3.select
Fcntl解決了文件共享的問題,接着就是I/O複用的問題。
IO處理模型 包括,阻塞型IO模型,非阻塞模型,IO多路轉接模型,信號驅動IO模型,異步模型
對於select而言,屬於IO多路轉接模型
在這種模型下,如果請求的IO操作阻塞,且它不是真正的阻塞IO,而是讓其中的一個函數等待,在這期間,IO還能進行其他操作,select函數和poll函數就屬於此種模型。
#include<sys/types.h>
#include<sys/time.h>
#include<unistd.h>
int select(int numfds,fd_set *readfds,fd_set *writefds,fd_set *exeptfds,struct timeval *timeout)
numfds爲需要檢測的號碼最高的文件描述符+1
讀文件描述集 寫文件描述集 出錯文件描述集
Timeout,如果爲0則從不等待 測試所有的描述集之後就返回
如果爲NULL,表示永遠等待,直到捕捉到信號或者文件描述集已經準備好。
對文件描述集的操作包括,
FD_ZERO(fd_set *set)
FD_SET(int fd,fd_set *set)
FD_CLR(int fd,fd_set *set)
FD_ISSET(int fd,fd_set *set) 測試該集中的一個給定位是否有變化
對於select和poll的一些東東會在udev,socket,電源管理中進一步說明
2.標準IO開發
標準帶緩衝的IO操作包括三種緩衝存儲,全緩衝,行緩衝,不緩衝。
1.
Fopen fclose
FILE *stream;
stream=fopen(“test”,”r”); “r” “w” “a”
Fclose(stream);
Size_t fread(void *ptr,size_t size,size_t nmemb,FILE *stream)
Size_t fwrite(const void *ptr,size_t size,size_t nmemb,FILE *stream)
Size 一條記錄的大小
Nmemb 記錄的數目
Write返回成功寫入的記錄數目
例子,
#include<stdio.h>
Int main()
{
FILE *stream;
Char s[3]={‘a’,’b’,’c’};
Stream=fopen(“test”,”w”);
i=fwrite(s,sizeof(char),sizeof(s),stream);
fclose(stream);
}
2.
Fputc(fgetc(stdin),stdout);
Char s[80];
Fputs(fgets(s,80,stdin),stdout);