头文件 包含
<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 文件访问权限位小结