1.关于可用的IO函数,说法错误的是:(参考:UNIX环境高级编程,第2版,第3章,文件I/O,3.3 3.4 3.6 3.7小节)
A.调用open函数只能打开一个文件
B.调用creat函数可以创建一个新文件
C.可以调用lseek显式地为一个打开的文件设置其偏移量
D.调用read函数从打开文件中读数据;如read成功,则返回读到的字节数;如已到达文件结尾,则返回0
答案:A
试题解析
调用open函数可以打开或创建一个文件
int open(const char *pathname,int oflag, .../* mode_t mode */ )
将第三个参数写为 ... ,ISO C用这种方法表明余下参数的数量及其类型根据具体的调用会有所不同。对于open函数而言,仅当创建新文件时才使用第三个参数
pathname是要打开或创建文件的名字。oflag参数可用来说明此函数的多个选型。用下列一个或多个常量进行“或”运算构成oflag参数
O_RDONLY 只读打开
O_WRONLY 只写打开
O_RDWR 读、写打开
2.内核使用三种数据结构表示打开的文件,它们之间的关系决定了进程间的影响,内核为所有打开文件维持一张文件表,每个文件表项包含(多选):(参考:UNIX环境高级编程,第2版,第3章,文件I/O,3.10小节)
A.文件描述符
B.文件状态标识
C.当前文件偏移量
D.指向该文件v节点表项的指针
答案:BCD
试题解析
内核使用三种数据结构表示打开的文件,它们之间的关系决定了在文件共享方面一个进程对另一个进程可能产生的影响
每个进程在进程表中都有一个及录项,记录项包含有一张打开文件描述符表,可将其视为一个矢量,每个描述符占用一项。与每个文件描述符相关联的是:
a、文件描述符
b、指向一个文件表项的指针
内核为所有打开文件维持一张文件表。每个文件表项包含:
a、文件状态标志
b、当前文件偏移量
c、指向该文件v节点表项的指针
每个打开文件都有一个v节点结构。v节点包含了文件类型和对比文件进行各种操作的函数的指针
3.为了保证磁盘上实际文件系统与缓冲区高速缓存中内容的一致性,下列函数说法正确的是(多选):(参考:UNIX环境高级编程,第2版,第3章,文件I/O,3.13 小节)
A.sync函数只是将所有修改过的块缓冲区排入写队列,然后就返回,它并不等待实际写磁盘操作结束
B.fsync函数只对文件描述符filedes指定的单一文件起作业,并且等待写磁盘操作结束,然后返回
C.fdatasync函数类似于fsync,但它只影响文件的数据部分。而出数据外,fsync还会同步更新文件的属性
D.FreeBSD、Linux、Solaris、Darwin 平台都支持sync、fsync、fdatasync函数
答案:ABC
试题解析
FreeBSD、Linux、Solaris、Darwin 4种平台都支持sync和fsync函数。但是FreeBSD和Darwin并不支持fdatasync函数
4.fcntl函数可以改变已打开的文件的性质,其功能包括(多选):(参考:UNIX环境高级编程,第2版,第3章,文件I/O,3.14 小节)
A.复制一个现有的描述符
B.获得/设置文件描述符标记
C.获得/设置文件状态标记
D.获得/设置异步I/O所有权
E.获得/设置记录锁
答案:ABCDE
试题解析
fcntl函数有5中功能:
A.复制一个现有的描述符 (cmd=F_DUPFD)
B.获得/设置文件描述符标记 (cmd=F_GETFD或F_SETFD)
C.获得/设置文件状态标记 (cmd=F_GETFL或F_SETFL)
D.获得/设置异步I/O所有权 (cmd=F_GETOWN或F_SETOWN)
E.获得/设置记录锁 (cmd=F_GETLK、F_SETLK或F_SETLKW)
5.对于标准I/O,描述错误是(单选):(参考:UNIX环境高级编程,第2版,第3章,文件I/O,5.6 5.7 5.9 小节)
A.打开流,每次读一个字符的I/O函数包括:
int getc(FILE *fp)
int fgetc(FILE *fp)
int getchar(void)
B.打开流,每次输入一行的I/O函数包括:
char *fgets(char *restrict buf,int n,FILE *restrict fp)
char *gets(char *buf)
C.如果进行二进制I/O操作,即一次性读或写整个结构,常见的函数包括
size_t fread(void *restrict ptr,size_t size,size_t nobj,FILE *restrict fp)
size_t fwrite(const void *restrict ptr,size_t size,size_t nobj,FILE *restrict fp)
D.ftell和fseek函数用于执行格式化输出处理
答案:D
试题解析
ftell和fseek函数是用于定位标志I/O流的
有三种方法定位标志I/O流:
ftell和fseek函数
ftello和fseeko函数
fgetpos和fsetpos函数
执行格式化输出处理的函数包括
int printf(const char *restrict format, ...)
int fprintf(FILE *restrict fp,const char *restrict format,...)
int sprintf(char *restrict buf,const char *restrict format, ...)
int snprintf(char *restrict buf,size_t n,const char *restrict format, ...)