linux 文件I/O 编程

来源:互联网 发布:als矩阵分解推荐模型 编辑:程序博客网 时间:2024/06/05 18:18

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) 测试该集中的一个给定位是否有变化

 

       对于selectpoll的一些东东会在udevsocket,电源管理中进一步说明

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

原创粉丝点击