天天看点

Linux命令基础——08-linux-day04(stat-readdir-dup2)

在学习Linux命令基础总结了笔记,并分享出来。有问题请及时联系博主:​​Alliswell_WP​​,转载请注明出处。

08-linux-day04(stat-readdir-dup2)

一、学习目标

1、掌握stat/lstat函数的使用

2、了解文件属性相关的函数使用

3、了解目录操作相关的函数的使用

4、掌握目录遍历相关函数的使用

5、掌握dup、dup2函数的使用

6、掌握fcntl函数的使用

虚函数地址空间

Linux命令基础——08-linux-day04(stat-readdir-dup2)

二、文件和目录操作

1、打开最大文件数量

### xxx.c ---> xxx

>touch makefile

>vi makefile

1 ### xxx.c ---> xxx
 2 SrcFiles=$(wildcard *.c)
 3 TargetFiles=$(patsubst %.c,%,$(SrcFiles))
 4 
 5 all:$(TargetFiles)
 6 
 7 %:%.c
 8     gcc -o $@ $^ -g
 9     
10 clean:
11     rm -f $(TargetFiles)      

>touch openmax.c

>vi openmax.c

1 #include<stdio.h>
 2 #include<sys/types.h>
 3 #include<sys/stat.h>
 4 #include<fcntl.h>
 5 #include<unistd.h>
 6 
 7 int main()
 8 {
 9     int num = 3;
10     char filename[128]={0};
11     while(1)
12     {
13         sprintf(filename,"temp_%04d",num++);
14         if(open(filename,O_RDONLY|O_CREAT,0666) < 0)
15         {
16             perror("open error");
17             break;
18         }
19     }
20     printf("num == %d\n", num);
21     return 0;
22 }      

>make

>./openmax

open err:Too many open files

num == 1025

2、stat函数介绍

》man 2 stat

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

>touch hello

>vi hello

(随便输入内容后保存退出)

>ln hello hello.hard

>ls -lrt

>ls -i hello*

输出:2642317 hello 2642317 hello.hard(ls -i 指定文件——查看指定文件的索引号)

Linux命令基础——08-linux-day04(stat-readdir-dup2)
Linux命令基础——08-linux-day04(stat-readdir-dup2)
Linux命令基础——08-linux-day04(stat-readdir-dup2)

查找timespec结构体

>sudo grep -rn "struct timespec {" /usr/

查到time.h的位置 打开

>vi +9 文件位置

struct timespec {

  __kernel_time_t tv_sec;/*seconds*/当前时间到1970.1.1 0:0:0秒数

  long tv_nsec;/*nanoseconds*/纳秒

};

3、stat函数介绍2与stat命令

》stat函数参数

  pathname 文件名

  struct stat *buf 传出参数,定义struct stat sb;&sb

》返回值:成功返回0,失败返回-1

>touch stat.c

>vi stat.c

1 #include<stdio.h>

2 #include<sys/types.h>

3 #include<sys/stat.h>

4 #include<unistd.h>

5

6 int main()

7 {

8 if(argc != 2)

9 {

10 printf("./a.out filename\n");

11 return -1;

12 }

13 struct stat sb;

14 stat(argv[1],&sb);

15 return 0;

16 }

保存退出

>make

>gdb stat

(gdb)b main

(gdb)run hello

(gdb)n

回车直到return 0;

(gdb)p sb

 输出了结构体sb的信息

(gdb)p/o sb.st_mode

p/o 变量名:可以8进制查看某变量

》stat命令

>stat stat.c

还可以输出文件最近访问的时间(文件最新被读的时间)、最近更改的时间(内容更改)、最近改动的时间(大小、权限、硬链接等属性更改)

扩展:重定向可以只更改最近更改时间和最近改动时间,而不会更改文件最近访问时间

如:echo "hello world" >> hello;然后stat hello

4、实现ls -l命令1

实现ls -l命令2

stat与lstat的区别

access与truncate

readlink、unlink

unlink补充