apue lseek 读写练习
1 //apue p73 3.6 练习题 2 //如果使用追加方式打开文件,是否可以从任意位置读,写 3 #include <stdio.h> 4 #include <fcntl.h> 5 #include <unistd.h> 6 #include <stdlib.h> 7 #include <string.h> 8 void set_fl(int fd, int flag); 9 10 int main(int argc, char const *argv[]) 11 { 12 char rbuf; 13 char *wbuf = malloc(1024*sizeof(char)); 14 memset(wbuf, 0, 1024*sizeof(char)); 15 int fd, dupfd; 16 fd = open(argv[1], O_CREAT|O_RDWR,S_IRWXU|S_IRGRP|S_IWGRP|S_IRWXO); 17 dupfd = dup(fd); 18 sprintf(wbuf, "first fd =%d second fd =%d pid=%d\n", fd, dupfd, getpid()); 19 if (fd < 0) 20 perror("open error"); 21 set_fl(fd, O_APPEND); //设置追加模式 22 lseek(fd, 2 ,SEEK_SET);//设置文件目前位置是第二个字节 23 write(fd, wbuf, strlen(wbuf));//写文件 24 lseek(fd, 2 ,SEEK_SET);//从第二个字节读文件 25 while (read(fd, &rbuf, 1) > 0) {//循环读文件。 26 write(STDOUT_FILENO, &rbuf, 1); //输出读到的内容 27 } 28 close(fd); 29 close(dupfd); 30 free(wbuf); 31 exit(0); 32 } 33 34 // set file fl 35 void set_fl(int fd, int flag) { 36 int val; 37 fcntl(fd, F_GETFL, 0); 38 val |= flag; 39 fcntl(fd, F_SETFL, val); 40 }
执行结果
第一次执行
[root@MiWiFi-R3-srv apue test]# ./lseek lseek.log
rst fd =3 second fd =4 pid=4943
[root@MiWiFi-R3-srv apue test]#
第二次执行
[root@MiWiFi-R3-srv apue test]# ./lseek lseek.log
rst fd =3 second fd =4 pid=4943
first fd =3 second fd =4 pid=4955
结论:
O_APPEND方式打开文件的话,写会定位到文件末尾,
而读可以任意指定。