NO.6 Linux 代码模块

三、waitpid 子进程回收

二、获取文件属性

  •  1  1 /*
     2  2 用于获取文件的属性和元数据信息,并输出到终端。
     3  3 程序接受一个参数作为路径名,通过lstat函数获取指定文件的属性信息,并使用printf函数输出到终端。
     4  4 注释对代码进行了简要解释,帮助理解各个部分的功能。
     5  5 */
     6  6 #include <sys/types.h>
     7  7 #include <sys/stat.h>
     8  8 #include <stdint.h>
     9  9 #include <time.h>
    10 10 #include <stdio.h>
    11 11 #include <stdlib.h>
    12 12 #include <sys/sysmacros.h>
    13 13 
    14 14 int main(int argc, char *argv[])
    15 15 {
    16 16     struct stat sb;
    17 17 
    18 18     // 检查参数数量
    19 19     if (argc != 2) {
    20 20         fprintf(stderr, "Usage: %s <pathname>\n", argv[0]);
    21 21         exit(EXIT_FAILURE);
    22 22     }
    23 23 
    24 24     // 获取文件属性
    25 25     if (lstat(argv[1], &sb) == -1) {
    26 26         perror("lstat");
    27 27         exit(EXIT_FAILURE);
    28 28     }
    29 29 
    30 30     // 输出所属设备ID
    31 31     printf("ID of containing device:  [%jx,%jx]\n",
    32 32             (uintmax_t) major(sb.st_dev),
    33 33             (uintmax_t) minor(sb.st_dev));
    34 34 
    35 35     printf("File type:                ");
    36 36 
    37 37     // 输出文件类型
    38 38     switch (sb.st_mode & S_IFMT) {
    39 39     case S_IFBLK:  printf("block device\n");            break;
    40 40     case S_IFCHR:  printf("character device\n");        break;
    41 41     case S_IFDIR:  printf("directory\n");               break;
    42 42     case S_IFIFO:  printf("FIFO/pipe\n");               break;
    43 43     case S_IFLNK:  printf("symlink\n");                 break;
    44 44     case S_IFREG:  printf("regular file\n");            break;
    45 45     case S_IFSOCK: printf("socket\n");                  break;
    46 46     default:       printf("unknown?\n");                break;
    47 47     }
    48 48 
    49 49     printf("I-node number:            %ju\n", (uintmax_t) sb.st_ino);
    50 50 
    51 51     // 输出文件权限模式
    52 52     printf("Mode:                     %jo (octal)\n",
    53 53             (uintmax_t) sb.st_mode);
    54 54 
    55 55     // 输出链接数
    56 56     printf("Link count:               %ju\n", (uintmax_t) sb.st_nlink);
    57 57     
    58 58     // 输出文件所有者信息
    59 59     printf("Ownership:                UID=%ju   GID=%ju\n",
    60 60             (uintmax_t) sb.st_uid, (uintmax_t) sb.st_gid);
    61 61 
    62 62     // 输出首选I/O块大小
    63 63     printf("Preferred I/O block size: %jd bytes\n",
    64 64             (intmax_t) sb.st_blksize);
    65 65     
    66 66     // 输出文件大小
    67 67     printf("File size:                %jd bytes\n",
    68 68             (intmax_t) sb.st_size);
    69 69     
    70 70     // 输出分配的块数
    71 71     printf("Blocks allocated:         %jd\n",
    72 72             (intmax_t) sb.st_blocks);
    73 73 
    74 74     // 输出最后状态更改时间
    75 75     printf("Last status change:       %s", ctime(&sb.st_ctime));
    76 76     
    77 77     // 输出最后访问文件的时间
    78 78     printf("Last file access:         %s", ctime(&sb.st_atime));
    79 79     
    80 80     // 输出最后修改文件的时间
    81 81     printf("Last file modification:   %s", ctime(&sb.st_mtime));
    82 82 
    83 83     exit(EXIT_SUCCESS);
    84 84 }
    View Code

一、递归访问目录结构

  •  1 #include <stdio.h>
     2 #include <dirent.h>
     3 #include <string.h>
     4 
     5 
     6 void visit_directory(const char *path) {
     7     DIR *dir;    
     8     struct dirent *entry;    //指向目录信息的结构体指针
     9 
    10     // 打开目录
    11     dir = opendir(path);
    12     if (dir == NULL) {
    13         perror("opendir");
    14         return;
    15     }
    16 
    17     // 读取目录中的每个项
    18     while ((entry = readdir(dir)) != NULL)    //读完当面目录所有内容结束
    19     {    
    20         // 忽略 "." 和 ".." 原因:需要跳出递归
    21         if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0)
    22             continue;
    23 
    24         // 构建文件路径
    25         char file_path[256];
    26         snprintf(file_path, sizeof(file_path), "%s/%s", path, entry->d_name);
    27 
    28         // 判断是否是目录
    29         if (entry->d_type == DT_DIR) {
    30             // 递归访问子目录
    31             visit_directory(file_path);
    32         } else {
    33             // 处理文件
    34             printf("%s\n", file_path);
    35         }
    36     }
    37 
    38     // 关闭目录
    39     closedir(dir);
    40 }
    41 
    42 
    43 int main(int argc, char *argv[]) {
    44     const char *path = argv[1];  // 替换成你想要访问的目录路径
    45     visit_directory(path);
    46     return 0;
    47 }
    View Code
posted @ 2023-10-01 20:47  真是服了你个老六!!  阅读(20)  评论(0编辑  收藏  举报