unix环境编程学习-chapter 3 IO读写操作

原子操作pread,pwirte

#include <unistd.h>

ssize_t pread(int fd, void *buf, size_t nbytes, off_t offset);//返回值:读到的字节数,若已到文件结尾则返回0,若出错返回-1

ssize_t pwrite(int fd,const void *buf ,size_t nbytes, off_t offset);//返回值:若成功返回已写的字节数,若出错返因-1

pread,pwirte,相当于顺序调用lseek和read或write,但调用pread,pwrite时无法中断其定位和读写操作,并且不能更新文件指针。

od -c file:查看file的实际内容

文件共享:

 文件描述符:每个进程在进程表中都有一个记录项每个记录项中有一张打开的文件描述符表(所以才有必要复制文件描述符),每个文件描述符表项关联:(a)文件描述符标志。(b)指向一个文件表项的指针。

 文件表:内核为所有打开的文件维护一张文件表,每个文件表项包含:(a)文件状态标志(读、写、增写、同步、非阻塞等)。(b)当前文件的偏移量。(c)指向该文件v节点表项的指针。

    v节点:每个打开的文件(或设备)都有一个v节点结构。包含了文件类型和对此文件进行各种操作的函数的指针信息。对于大多数文件,v节点还包含了该文件的i节点(索引节点)。这些信息是在打开文件时从盘上读入内存的,所以所有关于文件的信息都是快速可供使用的。例如,i节点包含了文件的所有者、文件长度、文件所在的设备、指向文件在盘上所使用的实际数据块的指针等等。

fcntl函数可以改变已经打开文件的性质。

   int fcntl(int filedes, int cmd ,....);

cmd:

 F_DUPFD 复制一个现存的文件描述符。

 F_GETFD or F_SETFD 获得/设置文件描述符标志

 F_GETFL or F_SETFL 获得/设置文件状态标志 即open函数中mode的几种状态

 F_GETOWN or F_SETOWN 获得/设置异步I/0权限

 F_GETLK,F_SETLK or F_SETLKW 获得/设置记录锁