unix环境高级编程【读书笔记】

文件

Unix支持在不同进程之间共享打开的文件。

内核使用三种数据结构表示打开的文件:

原子操作

一般而言,原子操作指的是由多步组成的操作。如果该操作原子的执行,要么执行完所有步,要么一步也不执行,不可能只执行所有步骤的一个子集。

1、  任何一个需要多个函数调用的操作都不可能是原子操作。因为两个函数在调用期间,内核可能会临时挂起某个进程,unix提供一种操作是这种操作成为原子操作,即添加O_APPEND标志。

2、  注意:

原子操作函数:pread,  pwrite

Pread:相当于调用read、lseek,但是区别如下

l  调用pread时无法中断其定位和读操作

l  不更新文件指针

3.12 dup和dup2函数

=======================

Int dup(int files);

Int dup2(int files, int files2);

========================

功能:成功返回新的文件描述符,出错返回-1;

注意:

1、由dup返回的文件描述符,一定是当前可用文件描述符中最小的文件描述符。

2、可以用dup2指定返回的文件描述符的具体值。

l  如果file2正在打开,则先将其关闭。

l  如果files等于file2,则返回file2的值,而不关闭。

3、

  • dup(files) 等价于fcntl(fileds,F_DUPFD,0)
  • dup2(files1,files2)等价于close(files2),fcntl(fileds,F_DUPFD,files2)不完全等价,因为dup2是原子操作函数,而close和fcntl之间可能会被其他信号插入。

 

3.13   sync fsync和fdatasync函数

注意:

  延迟写:由于内核中设有缓冲区高速缓存或页面高速缓存,大多数的磁盘IO都是通过缓冲进行的,当写数据时,内核通常会将数据复制一份到缓冲区,但是如果缓冲区尚未写满,不会排入输出队列。直到缓冲区被写满或这块缓冲区需要重用来存储其他的数据。

优点:

  • 减少了磁盘的读写次数。

缺点:

  • 降低了文件内容的更新速度,如果系统发生故障可能会有一部分文件丢失。

解决方法:

²  Sync  fsync  fdatasync

Sync:

只是将所有修改过的块的缓冲区排入写对了,然后就返回。不等待写磁盘结束。

Fsync:

只针对文件描述符为files的单一文件起作用,等待文件写磁盘结束再返回。

Fdatasync:

只影响文件的数据部分,而且还具有同步更新文件属性的功能。

 

3.14  fcntl函数

可以改变自己打开的文件的性质。

===============================

#include <fcntl.h>

Int fcntl(int fileds,int cmd, …);

===============================

功能:

1)         复制一个现有的文件描述符cmd = F_DUPFD

2)         获得/设置文件描述符的标志 cmd = F_GETFD 或 F_SETFD

3)         获得/设置文件的状态标志  cmd = F_GETFL 或 F_SETFL

4)         获得/设置异步IO所有权 cmd = F_GETOWN 或 F_SETOWN

5)         获得/设置记录锁 cmd = F_GETLK 、F_SETLK或 F_SETLKW

注意:

l  第三个参数是指向一个结构的指针。

 

文件系统

如果用名字引用文件的函数时,需要了解该函数是否跟随符号链接到达它所链接的文件,如果具有,则其路径名参数引用由符号链接指向的文件,否则直接引用链接的本身,而 不是该链接指向的文件。(mkdir  mkinfo  mknod  rmdir这几个函数除外)

O_CREAT和O_EXCL两者调用open函数的时候若路径名引用符号链接,open将出错返回,并将errno设置为EEXIST。这种处理方式意图是堵塞一个安全性漏洞,是具有特权的进程不会被诱骗对不合适的文件进行写操作。

 

第四章              文件和目录

4.1  stat 、fstat和lstat函数

#include <sys/stat.h>

Int stat(const char *pathname, struct stat*buf);

Int fstat(int fileds, struct stat* buf);

Int lstat(const char *pathname,strcut stat *buf);

功能:成功返回0,若出错返回-1

Stat:

返回与命名文件有关的信息结构

Fstat:

返回与该文件描述符有关的信息结构

Lstat:

返回与该文件符号链接有关的有关信息结构

第二个参数    buf指针,指向我们必须提供的结构。

 

4.2  文件类型

1、文件的类型:

1)        普通文件 S_ISREG

2)        目录文件 S_ISDIR

  • 其他文件的名字
  • 指向其他文件信息结构的指针

注意:任何一个进程都有权限读目录文件,但是只有内核才有权限写该目录文件

3)        块特殊文件S_ISBLK

4)        字符特殊文件S_ISCHR

5)        FIFO S_ISFIF  管道,用于进程间通信(IPC)

6)        套接字 S_ISSOCK 用于进程间的网络通信

7)        符号链接S_ISLNK

 

 

 

 

 

 

 

 

 

 

 

posted @ 2013-09-05 23:31  lee_cher  阅读(231)  评论(0)    收藏  举报