Linux下的文件操作
文件读写
1 2 3 4 #include <stdio.h> size_t fread (void *ptr,size_t size,size_t nmemb,FILE *steam) ;size_t fwrite (void *ptr,size_t size,size_t nmemb,FILE *stream)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 #include <stdip.h> int printf (const char *format,...) ;int scanf (const char *format,...) ;int fprintf (FILE *stream,const char *format,...) ;int fscanf (FILE *stream,const char *format,...) ;int sprintf (char *str,const char *format,...) ;int sscanf (char *str,const char *format,...) ;int fgetc (FILE *stream) ;int fputc (int c,FILE *stream) ;int getc (FILE *stream) int putc (int c,FILE *stream) ; int getchar (void ) int putchar (int c) ; char *fgets (char *s,int size,FILE *stream) ;int fputs (const char *s,FILE *stream) ;int puts (const char *s) ;char *gets (char *s) ; int feof (FILE *stream) ; int fseek (FILE *stream,long offset,int whence) ;long ftell (FILE *stream) ; void rewind (FILE *stream) ;
目录操作
修改目录或文件的访问权限
1 2 #include <sys/stat.h> int chmod (const char *path,mode_mod mode) ;
获取、改变当前目录
1 2 3 #include <unistd.h> char *getcwd (char *buf,size_t size) ;int chdir (const char *path) ;
创建和删除目录
1 2 3 4 5 #include <sys/stat.h> #include <sys/types.h> #include <unistd.h> int mkdir (const char *pathname,mode_t mode) ;int rmdir (const char *pathname) ;
获取目录信息
1 2 3 4 5 6 7 8 #include <sys/types.h> #include <dirent.h> DIR *opendir (const char *name) ; struct dirent *readdir (DIR *dir) ; void rewinddir (DIR *dir) ;void seekdir (DIR *dir,off_T offset) ;off_t telldir (DIR *dir) ; int closedir (DIR *dir) ;
获取文件状态
1 2 3 4 #include <sys/types.h> #include <dirent.h> #include <unistd.h> int stat (const char *pathname,struct stat *buf) ;
读取目录信息的步骤:
用opendir函数打开目录;
使用readdir函数迭代读取目录的内容,如果已经读取的目录末尾。
用closedir函数关闭目录 #### dirent函数体: 1 2 3 4 5 6 7 8 struct dirent { ino_t d_ino; off_t d_off; unsigned shor d_reclen; unsigned char d_type; char d_name[256 ]; };
####
stat函数体: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 struct stat { mode_t st_mode; ino_t st_ino; 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; };
## 标准输入/输出流 stdin stdout stderror
打开、创建和关闭文件
1 2 3 4 5 6 7 #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> int open (const char *pathname,int flags) ; int open (const chat *pathname,int flags,mode_t mode) ;int create (const char *pathname,mode_t mode) ;
flag可选项:
O_RDONLY
以只读的方式打开
O_WRONLY
以只写的方式打开
O_RDWR
以读写的方式打开
O_CREAT
如果文件不存在,则创建文件
O_EXCL
仅与O_CREAT连用,如果文件存在,则强制open失败
O_TRUNC
如果文件存在,将文件截至0
O_APPEND
以追加的方式打开文件,每次调用write时,文件指针自动移到文件尾,用于多进程写同一文件的情况
O_NONBLOCK
非阻塞方式打开,无论有误数据读取或者等待,都会立即返回到进程之中
O_NODELAY
非阻塞方式打开
O_SYNC
同步打开文件,只有数据被真正吸入物理设备后才返回
mode可选项
S_IREADS,S_IRUSR
00400权限,代表该文件所有者具有可读取权限
S_IWUSR,S_IWRITE
00200权限
S_IXUSR,S_IEXEC
00100权限
S_IRWXG
00070权限
S_IRGRP
00040权限
S_IWGRP
00020权限
S_IXGRP
00010权限
S_IRWXO
00007权限
S_IROTH
00004权限
S_IWOTH
00002权限
S_IXOTH
00001权限
通常使用直接赋值的形式 eg:0775
Linux对于一个不存在的文件,不能通过O_WRONLY的方式打开,必须加上O_CREAT选项。
读取文件
1 2 3 4 #include <unistd.h> ssize_t read (int fd,void *buf,size_t count) ; ssize_t write (int fd,const void *buf,size_t count) ;
改变文件大小
1 2 3 4 5 #include <unistd.h> int ftruncate (int fd,off_t length) ;
文件定位
1 2 3 4 #include <sys/types.h> #include <unistd.h> off_t lseek (int fd,off_t offset,int whence) ;
获取文件信息
1 2 3 4 5 #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> int stat (const char *file_name,struct stat *buf) ; int fstat (int fd,struct stat *buf) ;
对于st_mode,以下宏可以对文件类型进行判断 | 宏 | 描述 | |
-------------- | -------------------- | | S_ISLNK(mode) |
判断是否为符号链接 | | S_ISREG(mode) | 判断是否为普通文件 | |
S_ISDIR(mode) | 判断是否为目录 | | S_ISCHR(mode) | 判断是否为字符型设备
| | S_IDBLK(mode) | 判断是否为块文件 | | S_ISFIFO(mode) |
判断是否为明明管道 | | S_ISSOCK(mode) | 判断是否为套接字 |
文件描述符的复制
1 2 3 4 #include <unistd.h> int dup (int oldfd) ;int dup2 (int oldfd,int newfd) ;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 #include "func.h" int main () { int fd = open ("a.txt" ,O_WRONLY|O_CREAT,0644 ); int fde=open ("error.txt" ,O_WRONLY|O_CREAT,0644 ); if (-1 ==fd) { perror ("open error" ); } printf ("\n" ); int fd1=dup2 (fd,1 ); int fd2=dup2 (fde,2 ); close (fd); printf ("hello world\n" ); perror ("error row\n" ); close (fd1); close (fd2); return 0 ; }
I/O多路转接模型
1 2 3 4 #include <sys/select.h> #include <sys/time.h> int select (int maxfd,fd_set *readset,fd_set *writeset,fd_set *exceptionset,struct timeval *timeout) ;
maxfd
最大的文件描述符(其值应该为最大的文件描述符字+1)
readset
内核读操作的操作符字集合
writeset
内核写操作的描述符字集合
exceptionset
内核异常操作的描述符字集合
timeout
等待描述符就绪需要的时间
1 2 3 4 5 void FD_ZERO (fd_set *fdset) ; void FD_SET (int fd,fd_set *fdset) ;void FD_CLR (int fd,fd_set *fdset) ; int FD_ISSET (int fd,fd_set *fdset) ;
1 2 3 4 5 6 struct timeval { long tv_sec; long tv_usec; }
MMAP文件映射
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 #include <sys/mman.h> void * mmap (void * start,size_t length,int prot,int flags,int fd,off_t offset) ;int munmap (void *start,size_t lenght) ;
例子: 1 2 3 4 5 6 7 8 9 #include "func.h" int main () { int fd=open ("hello.txt" ,O_RDWR); char *p=mmap (NULL ,1024 ,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0 ); memcpy (p,"world" ,5 ); munmap (p,1024 ); return 0 ; }