当前位置:首页>Linux>linux系统编程(七):文件描述符基础详解

linux系统编程(七):文件描述符基础详解

  • 2026-08-19 02:45:39
linux系统编程(七):文件描述符基础详解

文件描述符基础详解 —— Linux"一切皆文件"的真正起点

在 Linux 里,文件、socket、管道、设备、定时器、信号 …… 几乎所有 I/O 资源都用一个小整数表示:文件描述符(file descriptor,fd)。这篇把 open / read / write / close / lseek / dup / fcntl 这套 fd 操作的基础讲清楚,理解之后再看高级特性(多路复用、mmap、io_uring)都会顺很多。


0. 引言:"一切皆文件"是什么意思

int fd1 = open("/tmp/data", O_RDONLY);          /* 普通文件 */int fd2 = socket(AF_INET, SOCK_STREAM, 0);      /* 网络 socket */int fd3 = open("/dev/tty", O_RDWR);             /* 终端设备 */int fd4;int pipefd[2]; pipe(pipefd);                    /* 管道 */fd4 = pipefd[0];char buf[100];read(fd1, buf, 100);   /* 读文件 */read(fd2, buf, 100);   /* 收网络包 */read(fd3, buf, 100);   /* 读键盘 */read(fd4, buf, 100);   /* 读管道 */

四种完全不同的资源,用同一个 read 函数和同一种 fd 类型操作。这就是 Unix "一切皆文件"哲学的精髓 —— 用一套 API 屏蔽所有 I/O 资源的差异。


1. fd 到底是什么

fd 是个小整数(一般 0-1023),是当前进程文件描述符表的下标。

进程的 fd 表fd 是整数索引,内核中每个槽存一个 struct file *):

fd
指向
0
struct file
 (stdin)
1
struct file
 (stdout)
2
struct file
 (stderr)
3
struct file
 (/tmp/data)
4
struct file
 (socket)

每个槽指向内核的 struct file,里面包含:偏移 / 引用计数 / 操作函数表 / 打开模式 等。

每个 fd 在用户空间是一个 int,对应内核里的 struct filestruct file 又指向 struct inode(真正的文件元数据)。多个 fd 可能指向同一个 file(dup 出来的),多个 file 可能指向同一个 inode(不同进程 open 同一个文件)。

1.1 三个标准 fd

#define STDIN_FILENO  0#define STDOUT_FILENO 1#define STDERR_FILENO 2

进程启动时由 shell / init 准备好,分别连到终端的输入、输出、错误流。

write(1"hello\n"6);    /* 等价 printf("hello\n") + flush */

1.2 fd 是可继承的

fork 后子进程继承父进程所有 fd(指向同一个 file,共享偏移)。exec 后默认也保留(除非设了 O_CLOEXEC)。


2. open —— 打开文件,拿到 fd

#include<fcntl.h>int open(const char *path, int flags, ... /* mode_t mode */ );int openat(int dirfd, const char *path, int flags, ...);

2.1 必选 flags:模式

flag
含义
O_RDONLY
只读
O_WRONLY
只写
O_RDWR
读写

2.2 常用可选 flags

flag
含义
O_CREAT
不存在则创建(要配 mode 参数)
O_EXCL
配合 O_CREAT:已存在则失败
O_TRUNC
已存在则截断到 0
O_APPEND
写时追加(每次 write 自动 lseek 到末尾)
O_NONBLOCK
非阻塞 IO
O_CLOEXECexec
 时自动关闭
O_DIRECTORY
必须是目录
O_PATH
只用作目录 fd,不读不写
O_TMPFILE
创建匿名临时文件(Linux 扩展)
O_DSYNC
 / O_SYNC
写后同步刷盘

2.3 例子

/* 只读打开 */int fd = open("/etc/passwd", O_RDONLY);/* 写、不存在就创建、权限 0644 */int fd = open("out.txt", O_WRONLY | O_CREAT | O_TRUNC, 0644);/* 打开但 exec 后关闭,避免泄漏到子进程 */int fd = open("/var/log/app.log", O_WRONLY | O_APPEND | O_CREAT | O_CLOEXEC, 0644);/* 安全的"创建独占"模式,避免覆盖 */int fd = open("lockfile", O_WRONLY | O_CREAT | O_EXCL, 0600);if (fd < 0 && errno == EEXIST) { /* 文件已存在 */ }

2.4 O_CLOEXEC 是必选

多线程程序里 open 不带 O_CLOEXEC 是潜在 bug:另一个线程可能正在 fork+exec,你刚 open 的 fd 会被泄漏到子进程。这是经典的安全漏洞来源。

int fd = open(path, O_RDONLY | O_CLOEXEC);   /* 写就对了 */

3. read / write —— 数据搬运

#include<unistd.h>ssize_t read(int fd, void *buf, size_t count);ssize_t write(int fd, const void *buf, size_t count);

返回值:

  • > 0
    :实际读/写的字节数
  • 0
    :read 时表示 EOF;write 时一般不返回 0
  • -1
    :出错,看 errno

3.1 短读 / 短写:必须循环

read 不保证一次读满 count 字节:

  • 文件:可能读到末尾就提前返回
  • 管道 / socket:对端没那么多数据,先返回已有的
  • 信号中断:EINTR

write 不保证一次写完 count 字节:

  • 内核缓冲满(pipe/socket)
  • 信号中断
  • 磁盘满(部分写入)

正确写 IO 必须循环

ssize_t write_all(int fd, const void *buf, size_t n) {    const char *= buf;    while (n > 0) {        ssize_t w = write(fd, p, n);        if (w < 0) {            if (errno == EINTR) continue;   /* 信号打断,重试 */            return -1;        }        p += w;        n -= w;    }    return 0;}ssize_t read_all(int fd, void *buf, size_t n) {    char *= buf;    while (n > 0) {        ssize_t r = read(fd, p, n);        if (r < 0) {            if (errno == EINTR) continue;            return -1;        }        if (r == 0break;        /* EOF */        p += r;        n -= r;    }    return p - (char*)buf;}

3.2 pread / pwrite:带偏移的版本

ssize_t pread (int fd, void *buf, size_t count, off_t offset);ssize_t pwrite(int fd, const void *buf, size_t count, off_t offset);

不修改 fd 的当前偏移。多线程并发读同一文件不同位置时必须用,否则 read + lseek 不原子。

3.3 readv / writev:scatter-gather

ssize_t readv (int fd, const struct iovec *iov, int iovcnt);ssize_t writev(int fd, const struct iovec *iov, int iovcnt);struct iovec {    void  *iov_base;    size_t iov_len;};

一次系统调用读/写多块不连续内存:

struct iovec iov[3];iov[0].iov_base = header; iov[0].iov_len = sizeof(header);iov[1].iov_base = body;   iov[1].iov_len = body_len;iov[2].iov_base = footer; iov[2].iov_len = sizeof(footer);writev(fd, iov, 3);    /* 一次系统调用写完三块 */

减少 syscall 次数,适合协议封包。


4. close —— 必须关,但不一定立刻关

int close(int fd);

关闭一个 fd。但是

  • 如果该 file 被多个 fd 共享(dup 出来的),只是引用计数 -1
  • 引用计数归 0 时才真的释放底层资源
int fd1 = open("a", O_RDONLY);int fd2 = dup(fd1);close(fd1);           /* 文件还活着,fd2 可以继续用 */read(fd2, ...);close(fd2);           /* 现在文件真的关了 */

close 失败也通常意味着已关。errno 可能是 EIO(之前 write 的延迟错误现在才报),但 fd 本身已无效,不要重试 close。


5. lseek —— 改文件偏移

#include<unistd.h>off_t lseek(int fd, off_t offset, int whence);/* whence: *   SEEK_SET - 从文件开头 *   SEEK_CUR - 从当前偏移 *   SEEK_END - 从文件末尾 */

例子:

lseek(fd, 0, SEEK_END);                /* 文件末尾,返回文件大小 */off_t cur = lseek(fd, 0, SEEK_CUR);    /* 拿当前偏移 */lseek(fd, 100, SEEK_SET);              /* 跳到 100 字节处 */lseek(fd, -1024, SEEK_END);            /* 末尾前 1KB */

5.1 lseek 不能用于 pipe/socket/fifo

它们没有"位置"概念。返回 -1 + ESPIPE。

5.2 文件空洞

lseek(fd, 1*1024*1024*1024, SEEK_SET);write(fd, "x"1);    /* 中间 1GB 是"空洞",磁盘上不占空间 */

读空洞会得到 0 字节。


6. dup / dup2 / dup3 —— 复制 fd

int dup(int oldfd);int dup2(int oldfd, int newfd);int dup3(int oldfd, int newfd, int flags);

让两个 fd 指向同一个内核 file(共享偏移、模式、锁)。

6.1 经典用法:重定向 stdin/stdout

/* 把 stdout 重定向到文件 */int fd = open("out.log", O_WRONLY | O_CREAT | O_TRUNC, 0644);dup2(fd, STDOUT_FILENO);     /* 关闭原 stdout,让 1 指向 fd 指向的 file */close(fd);                    /* 不再需要原 fd,文件还活着 */printf("this goes to out.log\n");

6.2 shell 的 > 重定向

ls > out.txt

shell 内部:

pid_t pid = fork();if (pid == 0) {    int fd = open("out.txt", O_WRONLY | O_CREAT | O_TRUNC, 0644);    dup2(fd, STDOUT_FILENO);    close(fd);    execvp("ls", argv);}

6.3 shell 的管道 |

A | B 内部:

int p[2]; pipe(p);if (fork() == 0) {                /* 进程 A */    dup2(p[1], STDOUT_FILENO);    /* stdout → 管道写端 */    close(p[0]); close(p[1]);    execvp("A", ...);}if (fork() == 0) {                /* 进程 B */    dup2(p[0], STDIN_FILENO);     /* stdin → 管道读端 */    close(p[0]); close(p[1]);    execvp("B", ...);}close(p[0]); close(p[1]);wait(NULL); wait(NULL);

6.4 dup3:原子设 flags

dup3(oldfd, newfd, O_CLOEXEC);    /* 原子 dup + 设 close-on-exec */

跟 pipe2 同思路,避免 race window。多线程程序首选。


7. fcntl —— fd 杂项操作

#include<fcntl.h>int fcntl(int fd, int cmd, ... /* arg */ );

万能 fd 操作工具,常用的几个:

7.1 F_DUPFD / F_DUPFD_CLOEXEC:dup 加强版

int newfd = fcntl(oldfd, F_DUPFD, 100);   /* 找 ≥100 的最小可用 fd */int newfd = fcntl(oldfd, F_DUPFD_CLOEXEC, 0);   /* 同时设 CLOEXEC */

7.2 F_GETFD / F_SETFD:fd 标志(仅有 FD_CLOEXEC)

int flags = fcntl(fd, F_GETFD);fcntl(fd, F_SETFD, flags | FD_CLOEXEC);    /* 老办法,今天用 O_CLOEXEC 更好 */

7.3 F_GETFL / F_SETFL:文件状态标志

int flags = fcntl(fd, F_GETFL);fcntl(fd, F_SETFL, flags | O_NONBLOCK);    /* 改非阻塞 */fcntl(fd, F_SETFL, flags & ~O_NONBLOCK);   /* 改回阻塞 */

7.4 F_SETLK / F_SETLKW:建议性文件锁

struct flock lk = {    .l_type   = F_WRLCK,    /* 写锁 */    .l_whence = SEEK_SET,    .l_start  = 0,    .l_len    = 0,          /* 0 = 锁到末尾 */};fcntl(fd, F_SETLKW, &lk);   /* 阻塞获取 *//* ... */lk.l_type = F_UNLCK;fcntl(fd, F_SETLK, &lk);

仅在所有进程都用 fcntl 锁时才有效(advisory lock,建议性)。

7.5 F_SETPIPE_SZ / F_GETPIPE_SZ:调 pipe 缓冲大小

fcntl(pipe_fd, F_SETPIPE_SZ, 1024 * 1024);   /* pipe 缓冲调到 1MB */

8. 文件描述符表 vs 打开文件表 vs i-node 表

Linux 内核有三层数据结构:

理解这三层后,下面这些行为就解释通了:

8.1 fork 后父子共享 file,同一个 offset

int fd = open("a", O_RDONLY);fork();read(fd, buf, 10);   /* 父和子都读这个 fd,谁先读谁拿前 10 字节 */read(fd, buf, 10);   /* 另一个再读,从第 10 字节开始 */

8.2 dup 后两个 fd 共享 file,同一 offset

int fd2 = dup(fd1);read(fd1, buf, 10);read(fd2, buf, 10);   /* 接着读,offset 继续走 */

8.3 两次 open 同一个文件 → 两个 file,不同 offset

int a = open("x", O_RDONLY);int b = open("x", O_RDONLY);read(a, buf, 10);     /* a 的 offset = 10 */read(b, buf, 10);     /* b 的 offset = 10(独立)*/

9. /proc/PID/fd —— 看进程打开了什么

调试神器:

$/fd0 -> /dev/pts/01 -> /dev/pts/02 -> /dev/pts/03 -> /var/log/app.log4 -> socket:[123456]5 -> pipe:[789012]

每个进程的 fd 都能在这里看到,文件名也能反查。调"fd 泄漏"必备

lsof -p PID 是更友好的工具。


10. 几个常见坑

10.1 fd 泄漏

int fd = open(...);if (something_failed) return -1;     /* ⚠️ fd 没 close */

每个错误路径都要 close。C 没 RAII,纪律 + cleanup_push + goto 错误处理。

10.2 close 后 fd 立即可被复用

close(3);/* 如果在其他地方还在用 fd 3(跨线程、信号处理),现在再 read(3, ...) 可能读到刚 open 的新文件!*/int newfd = open(...);   /* 经常拿到 3 */

close 后立刻 fd = -1,避免 use-after-close。

10.3 短读短写没循环

90% 的 IO bug 来源。所有生产代码都要 read_all / write_all 包装。

10.4 忘记 O_CLOEXEC

多线程 + fork+exec 场景的隐藏 bug。

10.5 用 lseek + read 代替 pread(多线程)

两个线程并发:A lseek + B lseek + A read + B read,A 的偏移被 B 改了。多线程同 fd 用 pread/pwrite

10.6 不同进程 mmap 同一文件 vs read

mmap 的更新对其他进程立即可见(共享映射);read 是拷贝快照。


11. 总结表

函数
用途
关键点
open / openat
打开文件,返回 fd
flags 必有模式;推荐加 O_CLOEXEC
read / write
字节搬运
必须循环处理短读短写
pread / pwrite
带偏移版本
多线程并发同 fd 必备
readv / writev
scatter-gather
一次 syscall 多块内存
close
关闭
失败也算关;fd = -1 防 use-after-close
lseek
改文件偏移
pipe/socket 不支持
dup / dup2 / dup3
复制 fd
shell 重定向、管道用
fcntl
杂项操作
改 flags、文件锁、pipe size 等
/proc/PID/fd
看进程打开了什么
调试 fd 泄漏神器

12. 收尾

fd 是 Linux 系统编程的最核心抽象。所有更高级的概念都建立在 fd 之上:

  • 多路复用(select/poll/epoll)操作 fd 集合
  • mmap 把文件映射成内存,但起点还是 fd
  • 网络编程的 socket fd
  • 异步 IO(io_uring)也是用 fd

理解了 fd 的三层表(fd 表 → file 表 → inode 表),fork 共享、dup 复制、O_CLOEXEC 这些细节就一目了然。理解了短读短写要循环、所有错误路径都要 close,写出来的 IO 代码就稳。

请在微信客户端打开

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-08-22 00:43:34 HTTP/2.0 GET : https://f.mffb.com.cn/a/508531.html
  2. 运行时间 : 0.671354s [ 吞吐率:1.49req/s ] 内存消耗:4,723.45kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=9d70c6a773e668f06414790cfce6878b
  1. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/public/index.php ( 0.79 KB )
  2. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/autoload.php ( 0.17 KB )
  3. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/platform_check.php ( 0.90 KB )
  5. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_static.php ( 4.90 KB )
  7. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  10. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  11. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  12. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  13. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  14. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  15. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  16. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  17. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  18. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  19. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  20. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  21. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  22. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/provider.php ( 0.19 KB )
  23. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  24. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  25. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  26. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/common.php ( 0.03 KB )
  27. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  28. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  29. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/app.php ( 0.95 KB )
  30. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cache.php ( 0.78 KB )
  31. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/console.php ( 0.23 KB )
  32. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cookie.php ( 0.56 KB )
  33. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/database.php ( 2.48 KB )
  34. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  35. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/filesystem.php ( 0.61 KB )
  36. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/lang.php ( 0.91 KB )
  37. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/log.php ( 1.35 KB )
  38. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/middleware.php ( 0.19 KB )
  39. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/route.php ( 1.89 KB )
  40. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/session.php ( 0.57 KB )
  41. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/trace.php ( 0.34 KB )
  42. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/view.php ( 0.82 KB )
  43. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/event.php ( 0.25 KB )
  44. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  45. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/service.php ( 0.13 KB )
  46. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/AppService.php ( 0.26 KB )
  47. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  48. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  49. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  50. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  51. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  52. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/services.php ( 0.14 KB )
  53. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  54. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  55. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  56. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  57. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  58. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  59. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  60. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  61. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  62. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  63. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  64. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  65. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  66. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  67. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  68. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  69. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  70. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  71. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  72. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  73. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  74. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  75. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  76. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  77. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  78. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  79. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  80. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  81. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  82. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  83. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/Request.php ( 0.09 KB )
  84. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  85. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/middleware.php ( 0.25 KB )
  86. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  87. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  88. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  89. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  90. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  91. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  92. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  93. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  94. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  95. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  96. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  97. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  98. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  99. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/route/app.php ( 1.72 KB )
  100. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  101. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  102. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  103. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/controller/Index.php ( 4.81 KB )
  104. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/BaseController.php ( 2.05 KB )
  105. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  106. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  107. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  108. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  109. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  110. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  111. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  112. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  113. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  114. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  115. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  116. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  117. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  118. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  119. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  120. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  121. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  122. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  123. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  124. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  125. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  126. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  127. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  128. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  129. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  130. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  131. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  132. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  133. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  134. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  135. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  136. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  137. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  138. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  139. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/runtime/temp/067d451b9a0c665040f3f1bdd3293d68.php ( 11.98 KB )
  140. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.001033s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.001387s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.022722s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.003069s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.001484s ]
  6. SELECT * FROM `set` [ RunTime:0.013941s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.001743s ]
  8. SELECT * FROM `article` WHERE `id` = 508531 LIMIT 1 [ RunTime:0.014818s ]
  9. UPDATE `article` SET `lasttime` = 1787330614 WHERE `id` = 508531 [ RunTime:0.040843s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 67 LIMIT 1 [ RunTime:0.000895s ]
  11. SELECT * FROM `article` WHERE `id` < 508531 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.007158s ]
  12. SELECT * FROM `article` WHERE `id` > 508531 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.004582s ]
  13. SELECT * FROM `article` WHERE `id` < 508531 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.112826s ]
  14. SELECT * FROM `article` WHERE `id` < 508531 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.118342s ]
  15. SELECT * FROM `article` WHERE `id` < 508531 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.156701s ]
0.676599s