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);