Unix I/O总结

输入是从I/O设备拷贝数据到主存,输出是从主存拷贝数据到I/O设备。

一个文件就是一个字节序列。

所有的I/O设备,如网络、磁盘、和终端,都被模型化为文件,而所有的输入和输出都被当做想对应的文件的读写来执行。

1、打开文件:
一个应用程序通过要求内核来打开文件,内核返回一个小的非负整数(描述符),内核记录有关这个文件的所有的信息,应用程序只需要记住这个描述符。

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h> int open(char *filename, int flags, mode_t mode);//Returns: new file descriptor if OK, −1 on error

  flags 参数 :

  • .  O_RDONLY: Reading only

  • .  O_WRONLY: Writing only

  • .  O_RDWR: Reading and writing 

 

2、关闭文件

#include <unistd.h> 
int close(int fd);

3、读文件

include <unistd.h>
ssize_t read(int fd, void *buf, size_t n);//Returns: number of bytes read if OK, 0 on EOF, −1 on error

可靠的读

ssize_t rio_readn(int fd, void *usrbuf, size_t n) {
size_t nleft = n;
ssize_t nread;
char *bufp = usrbuf;
while (nleft > 0) {
    if ((nread = read(fd, bufp, nleft)) < 0) {
}
        if (errno == EINTR)
            nread = 0;
        else
            return -1;
    }
    else if (nread == 0)
        break;
    nleft -= nread;
    bufp += nread;
}
return (n - nleft);
}

  

:

  

 

  

4、写文件

#include <unistd.h>

ssize_t write(int fd, const void *buf, size_t n);//Returns: number of bytes written if OK, −1 on error

可靠的写 :

ssize_t rio_writen(int fd, void *usrbuf, size_t n)
    size_t nleft = n;
    ssize_t nwritten;
    char *bufp = usrbuf;
while (nleft > 0) {
    if ((nwritten = write(fd, bufp, nleft)) <= 0) {
        if (errno == EINTR)  /* Interrupted by sig handler return */
                nwritten = 0;
            else
return -1;
        }
        nleft -= nwritten;
        bufp += nwritten;
}
return n; }

 

 

5、标准I/O

ANSI C定义了一组高级的输入输出函数,称为标准I/O库,为程序员提供了Unix I/O的较高级别的替代。

1)打开和关闭文件:fopen和fclose

2)读和写字节的函数:fread和fwrite

3)读写字符串:fgets和fputs

4)复杂的格式的I/O:scanf和printf

标准I/O库将一个打开的文件模型化为一个流。一个流就是一个指向FILE类型的结构的指针。

  

 

 

 

 

 

 

 

 

posted @ 2013-04-14 11:41  shangdahao  阅读(2073)  评论(0编辑  收藏  举报