
APUE编程
IO操作
董哥的黑板报
90后程序员!
展开
-
APUE编程:01---标准I/O库之(标准I/O库介绍、FILE对象、流定向(fwide())、标准输入/输出/错误)
一、流的概念二、流定向的概念概念:一个字符可以用单字节表示也可以用多字节表示。流的定向决定了所读、写的字符是单字节还是多字节的未定向的流的使用:当一个流最初被创建时,它并没有定向如果在未定向的流上使用一个多字节IO函数,则该流的定向设置为宽定向的 若在未定向的流上使用一个单字节IO函数,则该流的定向设为字节定向的freopen:用来清除一个流的定向 fwide:用...原创 2019-04-17 15:20:46 · 1130 阅读 · 0 评论 -
APUE编程:02---标准I/O库之(缓冲区与缓冲设置函数:setbuf()、setvbuf()、fflush())
此篇缓冲区的概念针对于标准IO 一、缓冲区的目的二、缓冲区的分类①全缓冲概念:当填满缓冲区后才进行实际I/O操作 对于驻留在磁盘上的文件通常是由标准I/O库实施全缓存的②行缓冲概念:当遇到换行符时,才执行IO操作 即使没有遇到换行符,但是缓冲区满了也进行刷新缓冲区了③无缓冲概念:不进行缓冲,直接进行IO操作缓冲区的使用:打开至终...原创 2019-04-17 15:49:02 · 831 阅读 · 0 评论 -
APUE编程:03---标准I/O库之(流的打开与关闭:fopen()、freopen()、fdopen()、fclose())
一、流的打开#include <stdio.h>FILE *fopen(const char *restrict pathname, const char *restrict type);FILE *freopen(const char *restrict pathname, const char *restrict type,FILE *restrict fp);FILE...原创 2019-04-17 16:17:52 · 868 阅读 · 0 评论 -
APUE编程:04---标准I/O库之(流的读、写、错误处理:getc()、getchar()、ungetc()、putc()、ferror)
一、单字符读和写1.输入函数#include <stdio.h>int getc(FILE *fp);int fgetc(FILE *fp);int getchar(void);//返回值:若成功则为下一个字符,若已处文件尾端或出错则为EOF不同点:①函数getchar等同于getc(stdin)②前两个函数的区别是getc可被实现为宏,而fgetc则...原创 2019-04-17 16:42:22 · 510 阅读 · 0 评论 -
APUE编程:06---标准I/O库之(二进制I/O:fread()、write())
一、前言在前面一篇文章中我们介绍的函数以一次一个字符或一次一行的方式进行操作。如果进行二进制I/O操作,那么我们更愿意一次读活蟹一个完整的结构。如果使用getc()或putc()读、写一个结构,那么必须循环通过整个结构,每次循环处理一个字节,一次读或写一个字节,这会非常的麻烦。如果使用fputs()或fgets(),那么因为fputs()在遇到null字节时就停止,而在结构中可能含有null字节,所以不能使用它实现读结构的要求;类似的,fgets()遇到null也会停止工作 因此提供了下面两个函数以张原创 2020-06-25 11:12:52 · 1184 阅读 · 0 评论 -
APUE编程:09---标准I/O库之(获取流的描述符函数:fileno())
待续原创 2019-04-18 12:44:40 · 457 阅读 · 0 评论 -
APUE编程:10---标准I/O库之(临时文件名/文件生成函数:tmpnam()、tmpfile()、mktemp()、mkstemp())
临时文件的使用情况很多情况下,程序会利用一些文件形式的临时存储手段。这些临时文件可能保存着一个计算的中间结果,也可能是关键操作前的文件备份。例如,一个数据库应用程序在删除记录时就可能使用临时 文件。该文件收集需要保留的数据库条目,然后在处理结束后,这个临时文件就变成新的数据库,原来文件则被删除临时文件的隐藏缺点临时文件的这种用法很常见,但也有一个隐藏的缺点。你必须确保应用程序为...原创 2019-06-03 12:26:59 · 1417 阅读 · 0 评论 -
APUE编程:12---文件I/O之(文件描述符、操作函数:open、openat、creat、close、lseek、read、write)
这些函数都不带缓冲 一、open()、openat()#include<fcntl.h>int open(const char *pathname , int oflag,.../*, mode_t mode*/);int openat(int fd,const char *pathname , int oflag,.../*, mode_t mode*/);//...原创 2019-03-31 16:59:44 · 957 阅读 · 0 评论 -
APUE编程:13---文件I/O之(I/O的效率)
一、来看一个例子下面的程序从标准输入获取数据,然后将内容输出到标准输出中:#include <stdio.h>#include <unistd.h>#define BUFFSIZE 4096int main(){ int n; char buf[BUFFSIZE]; while((n = read(STDIN_FILENO, buf, BUFFSIZE)) > 0) if(write(STDOUT_FILENO, b原创 2020-06-25 13:58:16 · 716 阅读 · 0 评论 -
APUE编程:14---文件I/O之(文件共享、文件原子操作(pread()、pwrite()))
一、文件的打开每个进程打开文件时,一般有三项:①进程表项中的一个进程指向于一个文件表项 ②每个进程都有一个属于自己的文件标项 ③文件表项的节点指针指向于真实的文件下图是两个不同的进程分别打开不同的文件的演示二、文件共享概念:我们知道一个文件可以被多个不同的进程同时打开例如:两个不同的进程打开同一个文件先用文件指针打开自己的文件表项 然后通过文件表项的节点...原创 2019-03-31 22:32:05 · 676 阅读 · 0 评论 -
APUE编程:15---文件I/O之(文件描述符复制函数:dup()、dup2())
一、函数介绍#include <unistd.h>int dup(int fd);int dup2(int fd, int fd2);//两函数的返回:若成功为新的文件描述符,若出错为- 1//参数:1.一个已存在并打开的文件描述符dup():不能指定新的文件描述符,系统自己分配一个最小的可用的文件描述符dup2():可以用参数2指定新的文件描述符 如...原创 2019-04-01 09:46:03 · 673 阅读 · 0 评论 -
APUE编程:16---文件I/O之(缓存与缓存函数:sync()、fsync()、fdatasync())
缓冲区UNIX系统在内核中设有缓冲区高速缓存和页高速缓存,大多数磁盘IO都通过缓冲区进行。当我们向文件写入数据时,内核通常先将数据复制到缓冲区,然后排入队列,晚些时候再写入磁盘。这种方式成为延迟写 通常,当内核需要重用缓冲区来存放其他磁盘块数据时,它会把所有延迟写数据块写入磁盘。为了保证磁盘上实际文件系统与缓冲区中内容一致性。UNIX系统提供了下面三个函数sync、fsync、fdatas...原创 2019-04-01 09:52:54 · 707 阅读 · 0 评论 -
APUE编程:17---文件I/O之(fcntl函数)
fcntl函数#include <sys/types.h>#include <unistd.h>#include <fcntl.h>int fcntl(int fd, int cmd,.../*int arg*/);//参数:1.文件描述符 2.相关的选项 3.总是一个整数,但是在记录锁部分,这个参数则是指向一个结构的指针//返回:若成功返回值依...原创 2019-04-01 13:07:46 · 670 阅读 · 0 评论 -
APUE编程:18---文件I/O之(ioctl函数)
#include <unistd.h> //System V#include <sys/ioctl.h> //BSD and Linuxint ioctl(int d, int request, ...);详解参见文章:http://www.baike.com/wiki/ioctl一、函数介绍作用:操作特殊文件的底层设备参数。特别是,字符特殊文件(如...原创 2019-04-01 19:03:56 · 761 阅读 · 0 评论 -
APUE编程:19---文件I/O之(/dev/fd目录)
一、目录简介这个目录下面有一些文件,名为0、1、2等的文件二、目录功能打开文件/dev/fd/n等效于复制描述符n (假定描述符n是打开的)三、应用1//例如fd=open("/dev/fd/0", mode);注意事项一:通过这样/dev/fd/打开的文件,参数1对应的文件描述符必须是已经打开的注意事项二:拿我们这个为例:这个/dev/fd/0相...原创 2019-04-01 19:27:13 · 860 阅读 · 0 评论 -
APUE编程:20---高级I/O之(阻塞IO与非阻塞IO)
一、阻塞IO将系统调用分成两类:低速系统调用和其他低速系统调用是可能会使进程永远阻塞的一类系统调用,包括下面:二、非阻塞IO概念:非阻塞I/O使我们可以调用不会永远阻塞的I/O操作,例如open,read和write。如果这种操作不能完成,则立即出错返回,表示该操作如继续执行将继续阻塞下去对于给定的一个描述符,有两种方法对其指定非阻塞I/O:如果是调用open以获得该描述...原创 2019-04-16 15:26:06 · 618 阅读 · 0 评论 -
APUE编程:21---高级I/O之(记录锁/文件锁定:fcntl()、lockf()、struct flock)
一、文件锁定的概念文件锁定是多用户、多任务操作系统中一个非常重要的组成部分。程序经常需要共享数据,而这通常是通过文件来实现的。因此,对于这些程序来说,建立某种控制文件的方式就非常重要了。只有这样,文件才可以通过一种安全的方式更新,或者说,当一个程序正在对文件进行写操作时,文件就会进入一个暂时状态,在这个状态下,如果另外一个程序尝试读这个文件,它就会自动停下来等待这 个状态的结束实现文件锁的...原创 2019-10-19 13:42:10 · 723 阅读 · 0 评论 -
APUE编程:22---高级I/O之(IO多路复用:select()函数)
一、文件符集(fd_set)概念:文件符集可以看成是一个数组,可以向其中添加很多的文件描述符 数据类型:fd_set select就是通过获取文件符集进行操作的fd_set结构体的定义如下由此我们可以看出fd_set结构体仅包含一个整型数组,该数组的每一个元素的每一位(bit)标记一个文件描述符 FD_SETSIZE宏:限制了select能够同时处理的文件描述符的总量(在下面介绍...原创 2019-04-16 17:23:22 · 828 阅读 · 0 评论 -
APUE编程:23---高级I/O之(IO多路复用:pselect()函数)
select函数使用:https://blog.youkuaiyun.com/qq_41453285/article/details/89336199一、pselect函数#include <sys/select.h>int pselect(int maxfdp1, fd_set *restrict readfds,fd_set *restrict writefds, fd_se...原创 2019-04-16 20:07:50 · 567 阅读 · 0 评论 -
APUE编程:24---高级I/O之(IO多路复用:poll()函数)
一、poll函数概念poll函数类似于select函数,但是接口使用不同 poll函数可用于任何类型的文件描述符二、struct pollfd结构体struct pollfd { int fd; /* file descriptor to check, or <0 to ignore */ short events; /* events of interest ...原创 2019-04-16 21:06:43 · 691 阅读 · 0 评论 -
APUE编程:25---高级I/O之(IO多路复用:epoll()函数)
一、epoll简介概念:epoll是Linux特有的I/O复用函数。它在实现和使用上与select、 poll有很大差异 如何使用:首先,epoll使用一组函数来完成任务,而不是单个函数。其次,epoll把用户关心的文件描述符上的事件放在内核里的一个事件表中,从而无须像select和poll那样每次调用都要重复传入文件描述符集或事件集二、epoll_create函数#includ...原创 2019-04-16 21:46:22 · 915 阅读 · 0 评论 -
APUE编程:26---高级I/O之(异步IO:struct aiocb)
使用gcc编译AIO程序时,gcc命令需要加上-lrt一、异步的概念待续。。。二、不同系统的异步IOSystem V异步IO待续。。。BSD异步IO待续。。。POSIXS异步IO本文章介绍POSIXS异步IO三、struct aiocb结构体功能:异步IO使用AIO控制块来描述I/O操作,aiocb结构体定义了AIO控制块。AIO控制板...原创 2019-04-21 12:22:24 · 1747 阅读 · 0 评论 -
APUE编程:27---高级I/O之(非连续缓冲区读写:readv()、writev(),struct iovec)
一、函数功能#include <sys/uio.h>ssize_t readv(int fd, const struct iovec *iov, int iovcnt);ssize_t writev(int fd, const struct iovec *iov, int iovcnt);概念:readv和writev函数用于在一个函数调用中读、写多个非连续缓存。有时也将...原创 2019-04-17 13:28:26 · 950 阅读 · 0 评论 -
APUE编程:28---高级I/O之(自定义读写函数:readn()、writen())
这两个函数是自己实现的,不是系统自带的一、引入管道,FIFO以及某些设备(特别是终端和网络)具有以下两种性质:一次read操作所返回的数据可能少于所要求的数据,即使还没达到文件尾端。这不是 一个错误,应当继续读该设备 一次write操作的返回值也可能少于指定输出的字节数。这可能是由若干因素造成的, 例如,内核输出缓冲区变满。这也不是错误,应当继续写余下的数据至该设备。(通常, 只有对非...原创 2019-04-17 13:28:59 · 603 阅读 · 0 评论 -
APUE编程:30---高级I/O之(数据零拷贝:splice函数)
一、函数介绍#define _GNU_SOURCE /* See feature_test_macros(7) */#include <fcntl.h>ssize_t splice(int fd_in, loff_t *off_in, int fd_out, loff_t *off_out, size_t len, unsigned int ...原创 2019-11-04 12:17:53 · 538 阅读 · 0 评论 -
APUE编程:31---高级I/O之(数据零拷贝:tee函数)
一、函数介绍#define _GNU_SOURCE /* See feature_test_macros(7) */#include <fcntl.h>ssize_t tee(int fd_in, int fd_out, size_t len, unsigned int flags);功能:此函数在两个管道文件描述符之间复制数据,也是零拷贝操作 它不消...原创 2019-11-04 12:29:23 · 584 阅读 · 0 评论 -
APUE编程:32---高级IO之(数据零拷贝:sendfile()函数)
一、案例简介我们再次回到前面讨论过的str_cli函数。前面使用的select的版本仍使用阻塞式I/O。举例来说,如果在标准输入有一行文本可读,我们就调用read读入它,再调用 writen把它发送给服务器。然而如果套接字发送缓冲区已满,writen调用将会阻塞。在进程阻 塞于writen调用期间,可能有来自套接字接收缓冲区的数据可供读取。类似地,如果从套接字 中有一行输入文本可读,那么一旦标...原创 2019-05-05 23:14:15 · 649 阅读 · 0 评论 -
APUE编程:33---文件目录(文件类型:struct stat、stat、fstat、fstatat、lstat函数)
一、文件类型二、struct stat结构体struct stat { mode_t st_mode; /* file type & mode (permissions) */ ino_t st_ino; /* i-node number (serial number) */ dev_t st_dev; /* device number (file s...原创 2019-04-22 19:23:28 · 683 阅读 · 0 评论 -
APUE编程:34---文件目录(文件权限查看函数:access、faccessat)
一、文件访问权限二、文件的访问权限位每个文件有9个访问权限位,可以分为以下3类:三、access、faccessat函数#include <unistd.h>int access(const char *pathname, int mode);int faccessat(int fd, const char *pathname, int mode, int ...原创 2019-04-22 19:46:56 · 895 阅读 · 0 评论 -
APUE编程:35---文件目录(文件权限屏蔽字函数:umask)
一、umask函数#include <sys/stat.h>mode_t umask(mode_t cmask);//返回值:返回之前文件模式创建的屏蔽字//此函数是少数不会出错的函数之一功能:如果程序创建文件,则使用此函数来限制文件的访问权限,此函数设置的常量不会被设置到创建的文件的权限中去 注意事项:程序调用此函数并不会影响到系统的umask属性 cmask参...原创 2019-04-22 20:03:28 · 675 阅读 · 0 评论 -
APUE编程:36---文件目录(文件权限修改函数:chmod、fchmod、fchmodat)
一、函数#include <sys/stat.h>int chmod(const char *pathname, mode_t mode);int fchmod(int fd, mode_t mode);int fchmodat(int fd, const char *pathname, mode_t mode, int flag);//返回值:成功返回0;出错返回-1...原创 2019-04-22 22:28:48 · 659 阅读 · 0 评论 -
APUE编程:37---文件目录(文件黏着位)
原创 2019-05-10 21:26:06 · 393 阅读 · 0 评论 -
APUE编程:38---文件目录(用户、组ID修改:chown、fchown、fchownat、lchown)
一、函数#include <unistd.h>int chown(const char *path, uid_t owner, gid_t group);int fchown(int fd, uid_t owner, gid_t group);int lchown(const char *path, uid_t owner, gid_t group);#include...原创 2019-05-10 21:39:41 · 565 阅读 · 0 评论 -
APUE编程:39---文件目录(文件长度与文件空洞)
一、文件长度二、文件空洞图3-2程序(lseek函数):https://blog.youkuaiyun.com/qq_41453285/article/details/88929776原创 2019-05-11 16:17:28 · 500 阅读 · 0 评论 -
APUE编程:40---文件目录(文件截断:truncate、ftruncate)
#include <unistd.h>#include <sys/types.h>int truncate(const char *path, off_t length);int ftruncate(int fd, off_t length);//返回值:成功返回0;出错返回-1功能:这两个函数将path或fd打开的文件长度截断为length如果文件以前...原创 2019-05-11 16:32:50 · 558 阅读 · 0 评论 -
APUE编程:41---文件目录(硬链接:link、linkat、unlink、unlinkat、remove)
一、硬链接的创建(link、linkat)#include <unistd.h>int link(const char *existpath, const char *newpath);#include <fcntl.h> /* Definition of AT_* constants */#include <unistd.h>int linka...原创 2019-05-11 17:24:23 · 880 阅读 · 0 评论 -
APUE编程:42---文件目录(文件重命名:rename、renameat)
#include <stdio.h>int rename(const char *oldpath, const char *newpath);#include <fcntl.h> /* Definition of AT_* constants */#include <stdio.h>int renameat(int olddirfd, const c...原创 2019-05-11 19:12:10 · 1520 阅读 · 0 评论 -
APUE编程:43---文件目录(符号链接:symlink、readlink)
一、符号链接符号链接是对一个文件的间接指针符号链接避开了一些硬链接的限制当使用以名字引用文件的函数时,应当了解该函数是否处理符号链接如若函数具有处理符号链接的功能,则其路径名参数引用由符号链接指向的文件 否则,一个路径名参数引用符号链接,而不是由该链接指向的文件二、符号链接的循环问题三、符号链接的创建#include <unist...原创 2019-05-11 19:40:59 · 958 阅读 · 0 评论 -
APUE编程:45---文件目录(目录创建、删除:mkdir、mkdirat、rmdir)
一、目录的创建#include <sys/stat.h>#include <sys/types.h>int mkdir(const char *pathname, mode_t mode);#include <fcntl.h>#include <sys/stat.h>int mkdirat(int dirfd, const char...原创 2019-05-11 20:00:50 · 904 阅读 · 0 评论 -
APUE编程:46---文件目录(目录的打开、读取:opendir、readdir、rewinddir、closedir、telldir、seekdir)
一、目录的打开#include <sys/types.h>#include <dirent.h>DIR *opendir(const char *name);DIR *fdopendir(int fd);//返回值:成功返回目录指针;出错返回NULL这两个函数返回指向一个目录的DIR指针,然后供给其他函数使用 fdopendir:将一个打开的目录的f...原创 2019-05-11 20:44:01 · 961 阅读 · 0 评论