《UNIX环境高级编程》——读书笔记3, 4

头文件          包含

<unistd.h>  STDIN_FILENO, STDOUT_FILENO

<stdio.h>    printf, perror

<errno.h>

<string.h>   strerror(int errnum)


getc,putc, fgets  


 关键字restrict: 用于告诉编译器,哪些指针引用是可以优化,其方法是指明指向的对象,在函数中只通过该指针进行访问。


3. 文件I/O:

#include <fcntl.h> 

int open( const char *pathname, int oflag, ... /* mode_t mode */  );

oflag: O_RDONLY, O_WRONLY, ORDWR (0, 1, 2)

         其他:O_APPEND, O_CREAT, O_EXCL, O_TRUNC, O_NOCTTY, O_NONBLOCK

                   O_DSYNC, O_RSYNC, O_SYNC


#include <fcntl.h> 

int creat( const  char * pathname, mode_t mode );

  等效:open( pathname, O_WRONLY | O_CREAT | O_TRUNC, mode );


#include <unistd.h>

int close( int filedes );


#include <unistd.h>

off_t lseek( int filedes, off_t offset, int whence );

whence: SEEK_SET, SEEK_CUR, SEEK_END


当前偏移量:

off_t currpos;

currpos = lseek( fd, 0, SEEK_CUR );


#include <unistd.h>

ssize_t read( int filedes, void *buf, size_t nbytes );


#include <unistd.h>

ssize_t write( int filedes, void *buf, size_t nbytes );


3.10 文件共享:

进程表——文件描述符表——V节点表

进程表:fd标志,文件指针

文件表:文件状态标志,当前文件偏移量,V节点指针

V节点表:V节点信息,i节点信息,当前文件长度。i节点:文件所有者,文件长度,文件所在的设备,指向文件实际数据块所在位置的指针等。


3.11 原子定位搜索:

#include <unistd.h>

ssize_t pread( int filedes, void * buf, size_t nbytes, off_t offset );

ssize_t pwrite( int filedes, const void * buf, size_t nbytes, off_t offset );


3.12

#include <unistd.h>

int dup( int filedes ); 等效:fcntl( filedes, F_DUPFD, 0 );

int dup2( int filedes, int filedes2 ); 等效:close( filedes2 ); fcntl( filedes, F_DUPFD,filedes2 );


3.13

#include <unistd.h>

int fsync( int filedes ); 文件( 数据及属性 )

int fdatasync( int filedes ); 文件数据


void sync( void ); 系统周期调用


3.14

#include <fcntl.h>

int fcntl( int filedes, int cmd, ... /* int arg */ );

五种功能:

1) F_DUPFD; 

2) F_GETFD or F_SETFD;

3) 文件状态标志 F_GETFL or F_SETFL;

4)异步I/O所有权 F_GETOWN or F_SETOWN;

5)记录锁 F_GETLK or F_SETLK or F_SETLKW


3.15

#include <unistd.h>

#include <sys/ioctl.h>

#include <stropts.h>

int ioctl( int filedes, int request, ... );


4 文件和目录

4.2 

#inlcude <sys/stat.h>

int stat( const char * restrict pathname, struct stat * restrict buf );

int fstat( int filedes, struct  stat * buf );

int lstat( const char *restrict pathname, struct stat *restrict buf );

 

struct stat { 
        mode_t     st_mode;  // 文件对应的模式,文件,目录等
        ino_t      st_ino;         // inode节点号
        dev_t      st_dev;        // 设备号码
        dev_t      st_rdev;       // 特殊设备号码
        nlink_t    st_nlink;     // 文件的连接数
        uid_t      st_uid;         // 文件所有者
        gid_t      st_gid;         // 文件所有者对应的组
        off_t      st_size;         // 普通文件,对应的文件字节数
        time_t     st_atime;    // 文件最后被访问的时间
        time_t     st_mtime;   // 文件内容最后被修改的时间
        time_t     st_ctime;     // 文件状态改变时间
        blksize_t st_blksize;   // 文件内容对应的块大小
        blkcnt_t   st_blocks;   // 创建内容对应的块数量
};

4.3 文件类型

1) S_ISREG() regular file

2) S_ISDIR() directory file

3) S_ISCHR() block special file 

4) S_ISBLK() character special file  系统所有设备要么是3), 要么是4)

5) S_ISFIFO() FIFO   named pipe

6) S_ISLINK() socket

7) S_ISSOCK() symbolic link

表4-2

<sys/stat.h>

1) S_TYPEISMQ 消息队列

2) S_TYPEISSEM 信号量

3) S_TYPEISSHM 共享存储对象

 

4.4 设置用户ID和设置组ID

4.5 文件访问权限

表4-5

<sys/stat.h>

S_IRUSR, S_IWUSR, S_IXUSR

S_IRGRP, S_IWGRP, S_IXGRP

S_IROTH, S_IWOTH, S_IXOTH

 

4.6 新文件和目录的所有权

4.7 access

#include <unistd.h>

int access( const char *pathname, int mode );

表4-6: R_OK, W_OK, X_OK, F_0K(测试文件是否存在)

 

4.8 umask

#include <sys/stat.h>

mode_t umask( mode_t cmask ); 设置文件模式创建屏蔽字,并返回以前的值。

 

4.9 chmod和fchmod

#include <sys/stat.h>

int chmod( const char *pathname, mode_t mode );

int fchmod( int filedes, mode_t mode );

 

-rw-rwSrw-

ls命令将组执行权限表示为S,它表示设置组ID位已设置,同时,组执行位则未设置。

 

4.10 粘住位( sticky bit ): S_ISVTX

初始:若设置了,那么该程序第一次被执行并结束时,其程序正文部分的一个副本仍被保存在交换区。现已改变。

 

4.11 chown、fchown和lchown

#include <unistd.h>

int chown( const char * pathname, uid_t owner, gid_t group );

int fchown( int filedes,  uid_t owner, gid_t group );

int lchown( const char * pathname, uid_t owner, gid_t group );

 

4.12 文件长度

4.13 文件截短

#include <unistd.h>

int truncate( const char *pathname, off_t length );

int ftruncate( int filedes, off_t length );

 

4.14 文件系统

硬链接 st_nlink

符号链接( symbolic link ) 文件类型为S_IFLNK


i节点时固定长度的记录项,它包含有关文件的大部分信息:

文件类型、文件访问权限位、文件长度和指向该文件所占用的数据块的指针。

stat结构中多数信息取自i节点。只有两项放在目录项中:文件名和i节点编号。i节点编号的数据类型是ino_t.

 

4.15 link、unlink、remove和rename

#include <unistd.h>

int link( const char * existingpath,  const char * newpath );

int unlink( const char * pathname );

int remove( cosnt char * pathname );

int rename( cosnt char *oldname, const char *newname );

 

4.16 符号链接

4.17 symlink和readlink

#include <unistd.h>

int symlink( const char * actualpath, const char * sympath ); 创建一个符号链接

ssize_t readlink( const char* restrict pathname, char *restrict buf, size_t bufsize );

 

4.18 文件的时间

表4-10

st_atime 最后访问时间

st_mtime 最后修改时间

st_ctime i节点的最后更改时间

 

4.19 utime

#include<utime.h>

int utime( const char * pathname, const struct utimbuf *times  );

struct utimbuf {

    time_t actime;

    time_t modtime;

};

 

4.20 mkdir和rmdir

#include <sys/stat.h>

int mkdir( const char *pathname, mode_t mode );

int rmdir( const char *pathname );

 

4.21 读目录

#include <dirent.h>

DIR *opendir( const char * pathname );

struct dirent * readdir( DIR *dp );

void rewinddir( DIR *dp );

int closedir( DIR *dp );

long telldir( DIR *dp );

void seekdir( DIR*dp, long loc );

struct dirent{

    ino_t d_ino;

    char d_name[NAME_MAX +1];

};

 

4.22 chdir、fchdir和getcwd

#include <unistd.h>

int chdir( const char* pathname );

int fchdir( int filedes );

char *getcwd( char *buf, size_t size );

 

4.23 设备特殊文件

4.24 文件访问权限位小结

你可能感兴趣的:(《UNIX环境高级编程》——读书笔记3, 4)