文件读写/创建
例1: 用read()/write()从终端读取数据并输出到终端
myrw.c
#include <stdio.h> #include <string.h> #include <unistd.h> #include <sys/types.h> #include <fcntl.h> int main(int argc,char *argv[]) { char buf[1000]; int ret = read(0,buf,1000); write(1,buf,ret); return 0; }
编译链接运行, 键盘输入一些字符再回车后, 结果输出如下:
例2: 用lseek(), 将文件内容从尾到头打印输出
mylseek.c
#include <stdio.h> #include <errno.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <fcntl.h> #define ERROR(flag) \ if(flag) \ { \ printf("%d: ",__LINE__); \ fflush(stdout); \ perror("error"); \ exit(errno); \ } int main(int argc,char *argv[]) { int fd = open(argv[1],O_RDONLY); ERROR(fd == -1); int end = lseek(fd,0,SEEK_END); char ch; while(end--) { lseek(fd,end,SEEK_SET); read(fd,&ch,1); write(STDOUT_FILENO,&ch,1); } close(fd); return 0; }
编译/链接执行, 输出结果如下:
例3: 创建文件
myopen.c
#include <stdio.h> #include <errno.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <fcntl.h> #include <sys/stat.h> #define ERROR(flag) \ if(flag) \ { \ printf("%d: ",__LINE__); \ fflush(stdout); \ perror("error"); \ exit(errno); \ } #define MODE (S_IRWXU | S_IRWXG | S_IROTH) #define FLAGS int main(int argc,char *argv[]) { int mask = umask(0); //int fd = open(argv[1], O_RDWR | O_CREAT, MODE); int fd = creat(argv[1], 0777); ERROR(fd == -1); // umask(mask); close(fd); return 0; }
编译链接运行, 结果如下:
将myopen.c文件中的creat(...)注释掉, 启用open(...)部分, 编译执行后的输出结果如下:
比较前后结果不同, 重新创建的文件12345的文件属性不同.
将myopen,c文件中的umask(...)注释掉, 编译执行后输出结果如下:
其中, 注释掉umask(...)后, 创建文件的mode参数为0777, 但实际文件的却是775, 原因是前面的umask(0)起作用了. umask默认值是0002