当前位置:首页>Linux>linux系统编程(五):signal信号机制详解

linux系统编程(五):signal信号机制详解

  • 2026-08-18 23:10:47
linux系统编程(五):signal信号机制详解

signal 信号机制 —— Linux 异步事件的祖宗

在终端按 Ctrl+C,程序就停了;服务收到 SIGTERM 想优雅关闭;段错误时进程崩溃 + 留个 core 文件。这背后都是 信号(signal) 在工作 —— Unix 系统最古老的异步通知机制。这篇把 signal、sigaction、信号屏蔽、异步信号安全、signalfd 等关键点讲清楚。


0. 引言:Ctrl+C 是怎么让程序停的

如果想"按 Ctrl+C 但不退出",注册一个 SIGINT handler 把它吃掉就行。这就是信号最直观的用法。


1. 信号是什么

信号是一种异步通知机制:内核或其他进程往一个进程"投递"一个事件,进程可以选择忽略、捕获、或采用默认行为。

特点:

  • 异步
    :信号在任意时刻可能到来(除非屏蔽)
  • 不携带数据
    (除了信号编号本身)。要传数据用其他 IPC
  • 可丢失
    :标准信号(< 32)多次到来可能合并成一次
  • 每个进程独立维护一个信号 mask 和 handler 表

1.1 常见信号速查

信号
编号
默认行为
触发场景
SIGHUP
1
终止
终端断开、daemon 重读配置
SIGINT
2
终止
Ctrl+C
SIGQUIT
3
终止+core
Ctrl+\
SIGILL
4
终止+core
非法指令
SIGABRT
6
终止+core
abort() / assert() 失败
SIGFPE
8
终止+core
除零、浮点异常
SIGKILL
9
终止
不可捕获、不可屏蔽
SIGSEGV
11
终止+core
段错误(访问非法内存)
SIGPIPE
13
终止
写关闭的 socket / pipe
SIGALRM
14
终止
alarm() / timer
SIGTERM
15
终止
默认的 kill 信号(优雅退出)
SIGUSR1
/USR2
10/12
终止
用户自定义
SIGCHLD
17
忽略
子进程退出/停止
SIGCONT
18
继续
让停止的进程继续运行
SIGSTOP
19
停止
不可捕获、不可屏蔽
SIGTSTP
20
停止
Ctrl+Z

⚠️ SIGKILL(9)和 SIGSTOP(19)永远无法被捕获/屏蔽,是给系统管理员的"终极手段"。


2. signal() —— 简单但有坑

#include<signal.h>typedefvoid(*sighandler_t)(int);sighandler_tsignal(int signum, sighandler_t handler);

例子:让 Ctrl+C 不结束程序:

#include<signal.h>#include<stdio.h>#include<unistd.h>voidon_sigint(int sig){    printf("got SIGINT (%d), but I won't die\n", sig);}intmain(void){    signal(SIGINT, on_sigint);    while (1) {        printf("running...\n");        sleep(1);    }}

按 Ctrl+C,程序打印一句话继续跑。

signal() 的两个历史问题

  1. 不同 Unix 行为不一样
    :System V 的 signal 在 handler 触发后会自动 reset 到 SIG_DFL;BSD 的不会。Linux 默认行为是 BSD 风格,但这种语义模糊已经够让人头疼了
  2. handler 执行期间是否屏蔽同信号
    :BSD 屏蔽,System V 不屏蔽。

结论:现代代码不要用 signal,用 sigaction


3. sigaction —— 推荐写法

#include<signal.h>intsigaction(int signum,              const struct sigaction *act,              struct sigaction *oldact);struct sigaction {    void     (*sa_handler)(int);                    /* 简单 handler */    void     (*sa_sigaction)(intsiginfo_t *, void *); /* 详细 handler */    sigset_t   sa_mask;       /* handler 执行期间屏蔽哪些信号 */    int        sa_flags;    void     (*sa_restorer)(void);  /* 不要用 */};

最小例子:

voidon_sigint(int sig){    write(STDOUT_FILENO, "got SIGINT\n"11);}struct sigaction sa = {0};sa.sa_handler = on_sigint;sigemptyset(&sa.sa_mask);sa.sa_flags = SA_RESTART;       /* 让被中断的 syscall 自动重启 */sigaction(SIGINT, &sa, NULL);

3.1 sa_flags 常用值

标志
含义
SA_RESTART
被信号中断的 syscall(read/write/…)自动重启,避免你到处处理 EINTR
SA_SIGINFO
用 sa_sigaction 而非 sa_handler,能拿到详细信息
SA_NODEFER
handler 执行期间不屏蔽当前信号(不推荐,容易递归)
SA_NOCLDSTOP
子进程 stop/cont 时不发 SIGCHLD(只关心退出)
SA_NOCLDWAIT
SIGCHLD 默认行为变成自动回收(不变僵尸)
SA_RESETHAND
触发一次后 reset 成 SIG_DFL(一次性 handler)

3.2 拿到详细信息:sa_sigaction

voidon_segv(int sig, siginfo_t *info, void *ucontext){    fprintf(stderr, "SIGSEGV at addr %p, by signal from pid %d\n",            info->si_addr, info->si_pid);    _exit(128 + sig);}struct sigaction sa = {0};sa.sa_sigaction = on_segv;sa.sa_flags = SA_SIGINFO;sigemptyset(&sa.sa_mask);sigaction(SIGSEGV, &sa, NULL);

siginfo_t 里能拿到很多东西:

  • si_signo
    :信号编号
  • si_code
    :来源原因(SI_USER / SI_KERNEL / SEGV_MAPERR / SEGV_ACCERR …)
  • si_addr
    :导致段错误的地址
  • si_pid
     / si_uid:发送者的 pid / uid(如果是 kill 来的)
  • si_status
    :子进程退出码(SIGCHLD 用)

4. 信号生命周期

信号生命周期分 4 步:

① 产生

  • 内核
    :硬件异常(SIGSEGV/SIGFPE)、软件条件(SIGPIPE/SIGCHLD/SIGALRM)
  • 进程
    kill / raise / pthread_kill
  • 用户
    :tty 的 Ctrl+C / Ctrl+\ / Ctrl+Z

② 投递(pending)

  • 信号被加入目标进程的 pending 集合
  • 如果该信号被屏蔽(in sigmask)→ 留在 pending 等屏蔽解除

③ 递送(delivery)

  • 进程从内核态返回用户态时,检查 pending - mask = 待递送
  • 选一个递送(POSIX 不规定顺序,Linux 一般按编号)

④ 处理

  • SIG_DFL
    :默认行为(terminate / core / ignore / stop / continue)
  • SIG_IGN
    :丢弃
  • 用户 handler:跳到 handler 函数执行

5. 异步信号安全 —— 最容易踩的雷

5.1 什么是异步信号安全

handler 可以在程序的任何指令之间被插入执行 —— 你正在 malloc,handler 来了,再调 malloc 试试?死锁

不是所有函数都能在 handler 里调。POSIX 定义了一份 async-signal-safe 函数列表,按类别整理:

类别
✅ 安全(可在 handler 里调)
❌ 不安全(绝对不能调)
fd 操作
read
 / write / open / close / dup / fcntl
fopen
 / fclose
stdio
printf
 / fprintf / scanfstdio 全家
内存
malloc
 / free / calloc / realloc
进程退出
_exit
 / abort
exit
(会调 atexit handlers)
进程信息
getpid
 / getppid / getuid / getgid
信号
kill
 / raise / sigaction / sigprocmask / pthread_kill / sem_post / pause
同步
pthread_mutex_lock
 / cond(mutex 也不安全!
时间
sleep
 / alarm / time
错误处理
strerror_r
(注意是 _r 版本)
syslog
网络
gethostbyname

⚠️ 不能在 signal handler 里调 printf。看着能跑只是没撞上 race;handler 在 stdio 锁持有期间触发会死锁。

5.2 工程套路:handler 只设标志位

#include<signal.h>#include<stdatomic.h>static volatile sig_atomic_t got_sigint = 0;voidon_sigint(int sig){    got_sigint = 1;       /* sig_atomic_t 是异步安全的赋值 */}intmain(void){    struct sigaction sa = { .sa_handler = on_sigint };    sigaction(SIGINT, &sa, NULL);    while (!got_sigint) {        do_work();    }    /* 在主循环里调用复杂逻辑(printf、close fd...)安全 */    cleanup_and_exit();}

handler 只做最少的事 —— 设个标志,主循环检查标志再做复杂工作。

5.3 sig_atomic_t

volatile sig_atomic_t flag;
  • sig_atomic_t
    :保证赋值是单条 CPU 指令(异步安全)
  • volatile
    :禁止编译器把它 cache 在寄存器

不要用普通 int —— 多字节赋值理论上可被信号打断(虽然 x86/ARM 上小整数赋值实际原子)。


6. 信号屏蔽:sigprocmask

intsigprocmask(int how, constsigset_t *set, sigset_t *oldset);/* how: *   SIG_BLOCK   - 添加屏蔽 *   SIG_UNBLOCK - 取消屏蔽 *   SIG_SETMASK - 完全替换 mask */

进入临界区时屏蔽信号,避免被打断:

sigset_t set, oldset;sigemptyset(&set);sigaddset(&set, SIGINT);sigprocmask(SIG_BLOCK, &set, &oldset);/* 临界区:SIGINT 不会被递送,但会进 pending 队列 */do_critical();sigprocmask(SIG_SETMASK, &oldset, NULL);/* 解除屏蔽,pending 中的 SIGINT 在这一刻递送 */

⚠️ 多线程下不要用 sigprocmask,用 pthread_sigmask(语义相同,但只影响当前线程)。

sigsuspend:原子地"解屏蔽 + 等待"

sigset_t mask;sigemptyset(&mask);sigsuspend(&mask);        /* 原子地清空 mask + 阻塞,直到信号到来 */

经典场景:等待信号触发再继续。比"先解 mask 再 pause"更安全(避免 race window)。


7. 多线程下的信号

POSIX 规定:

  • 信号处理是进程级的
    :所有线程共享同一个 sigaction 表
  • 信号 mask 是线程级的
    :每个线程有自己的 mask(pthread_sigmask
  • kill(pid, sig)
     发给进程,由内核选一个未屏蔽该信号的线程递送
  • pthread_kill(tid, sig)
     发给指定线程

工程套路:有一个专用线程接信号,其他线程全屏蔽

sigset_t set;sigemptyset(&set);sigaddset(&set, SIGINT);sigaddset(&set, SIGTERM);/* 主线程屏蔽,所有后续 fork 出来的线程继承屏蔽 */pthread_sigmask(SIG_BLOCK, &set, NULL);/* 启动 worker 线程(继承屏蔽) */pthread_create(...);pthread_create(...);/* 主线程同步等信号 */int sig;sigwait(&set, &sig);printf("got signal %d, shutting down\n", sig);

sigwait 是同步等待信号,完全不走 handler 路径,可以放心调任何函数。这是多线程信号处理的最佳实践。


8. 现代写法:signalfd

#include<sys/signalfd.h>intsignalfd(int fd, constsigset_t *mask, int flags);

把信号变成 fd 上的读事件,可以放进 epoll 一起处理:

sigset_t mask;sigemptyset(&mask);sigaddset(&mask, SIGINT);sigaddset(&mask, SIGTERM);/* 屏蔽这些信号,让它们走 signalfd 而不是默认递送 */pthread_sigmask(SIG_BLOCK, &mask, NULL);int sfd = signalfd(-1, &mask, SFD_CLOEXEC | SFD_NONBLOCK);/* 把 sfd 加到 epoll,跟其他 fd 一起处理 */struct epoll_event ev = { .events = EPOLLIN, .data.fd = sfd };epoll_ctl(epfd, EPOLL_CTL_ADD, sfd, &ev);/* 事件循环 */while (1) {    epoll_wait(epfd, events, MAX_EVENTS, -1);    for (int i = 0; i < n; i++) {        if (events[i].data.fd == sfd) {            struct signalfd_siginfo si;            read(sfd, &si, sizeof(si));            printf("signal %d arrived\n", si.ssi_signo);        }        /* ... 处理其他 fd ... */    }}

signalfd 的好处:

  • 完全没有 async-signal-safe 限制,handler 里能调任何函数
  • 跟 epoll/select 自然集成
  • 多个信号在 fd 上排队,不会丢

现代事件驱动框架(libuv、libev、Boost.Asio)几乎都内置 signalfd 处理。


9. 优雅退出的标准范式

#include<signal.h>#include<stdatomic.h>static volatile sig_atomic_t shutdown_requested = 0;voidon_term(int sig){    shutdown_requested = 1;}intmain(void){    struct sigaction sa = { .sa_handler = on_term };    sigemptyset(&sa.sa_mask);    sa.sa_flags = SA_RESTART;    sigaction(SIGINT, &sa, NULL);    sigaction(SIGTERM, &sa, NULL);    while (!shutdown_requested) {        handle_one_request();    /* 不会被信号永远阻塞,syscall 被打断后自动重试或 EINTR 检查 */    }    /* 主循环退出后做清理 */    flush_logs();    close_db();    return 0;}

这是 daemon、服务、守护进程都通用的模板。


10. 几个特别的信号场景

10.1 SIGPIPE:写已关闭的 socket / pipe

write(closed_pipe_fd, buf, len);/* 默认 → SIGPIPE → 进程被杀! */

服务端代码 99% 要忽略 SIGPIPE:

signal(SIGPIPESIG_IGN);   /* write 改为返回 -1 + errno=EPIPE */

或者每次 send 时加 MSG_NOSIGNAL

send(fd, buf, len, MSG_NOSIGNAL);

10.2 SIGCHLD:自动 reap 子进程

如果只想让子进程退出后被自动回收:

struct sigaction sa = { .sa_handler = SIG_IGN };sigaction(SIGCHLD, &sa, NULL);/* 子进程退出后内核直接回收,不变僵尸 */

但你拿不到子进程的退出码。

或者注册 handler 自己 wait:

voidon_sigchld(int sig){    while (waitpid(-1NULL, WNOHANG) > 0) ;   /* 循环 reap,避免合并丢失 */}

⚠️ 必须循环 wait,因为 SIGCHLD 不排队 —— 多个子进程同时退出可能只触发一次 handler。

10.3 SIGSEGV:在 handler 里打印堆栈

#include<execinfo.h>voidon_segv(int sig, siginfo_t *info, void *uc){    fprintf(stderr, "SIGSEGV at %p\n", info->si_addr);    void *frames[64];    int n = backtrace(frames, 64);    backtrace_symbols_fd(frames, n, STDERR_FILENO);    /* 重置 handler 让它真崩,生成 core */    signal(sig, SIG_DFL);    raise(sig);}

不过 backtrace_symbols_fd 严格说不是异步安全(内部可能 malloc)。生产代码用 libunwind 或 signal-safe-stacktrace 之类的方案。


11. 异步信号安全函数清单(精简)

记忆口诀(按类别 4 大块):

类别
函数
✅ fd 操作
read
 / write / open / close / dup / fcntl
✅ 进程
kill
 / raise / _exit / abort / getpid
✅ 信号
sigaction
 / sigprocmask / sem_post
❌ 一律禁用
所有 stdio、malloc、mutex、exit

12. 几个最大的坑

12.1 在 handler 里调 printf

stdio 内部有锁,可能死锁。永远用 write(STDERR_FILENO, ...) 代替。

12.2 长 read / write 被信号中断返回 EINTR

ssize_t n = read(fd, buf, sz);if (n < 0 && errno == EINTR) {    /* 被信号打断,自己重试 */}

或者 sa_flags |= SA_RESTART 让内核自动重启。注意不是所有 syscall 都支持自动重启(select、accept 在某些 Unix 上不行)。

12.3 SIGCHLD handler 不循环 wait → 漏 reap

多个子进程同时退出时,SIGCHLD 信号会合并,handler 只触发一次。必须用 while (waitpid(-1, NULL, WNOHANG) > 0) ;

12.4 多线程错误使用 signal/sigaction

sigaction 是进程级的,但 mask 是线程级的。在线程里调 sigprocmask 改的是当前线程的 mask(Linux 实际就是 pthread_sigmask)。

12.5 SIGKILL/SIGSTOP 不能被捕获

写 signal(SIGKILL, my_handler) 会失败返回 SIG_ERR。这是设计如此 —— 总要有终极手段干掉无响应进程。


13. 总结表

API
用途
推荐度
signal()
简单注册 handler
⚠️ 老旧,避免
sigaction()
详细注册 handler + flags
⭐ 首选
kill(pid, sig)
给进程发信号
raise(sig)
给自己发
pthread_kill(tid, sig)
给特定线程发
⭐ 多线程用
sigprocmask
 / pthread_sigmask
屏蔽信号
sigsuspend
原子解屏蔽 + 等待
sigwait
同步等待信号
⭐⭐ 多线程最佳
signalfd
信号 fd 化,进 epoll
⭐⭐⭐ 现代写法

14. 收尾

信号是 Unix 最古老的 IPC 机制(70 年代就有了)—— 缺点很多,但仍是必备技能:

维度
内容
❌ 缺点
不携带数据 / 可丢失 / 异步打断;async-signal-safe 限制让 handler 几乎写不了真正的逻辑;跟多线程交互复杂
✅ 必备场景
Ctrl+C
 与 SIGTERM 优雅退出(几乎所有服务都要);SIGCHLD 处理子进程(fork 用户必学);SIGPIPE 忽略(网络编程必需);SIGSEGV 抓 crash(调试必需)
⭐ 现代最佳实践
① 用 sigaction(不用老的 signal)  ② handler 只设 sig_atomic_t 标志  ③ 多线程用专用线程 + sigwait  ④ 现代事件循环用 signalfd

金句:handler 不是写逻辑的地方,是"通知主循环有事发生"的地方。

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-08-21 18:55:58 HTTP/2.0 GET : https://f.mffb.com.cn/a/505980.html
  2. 运行时间 : 0.225179s [ 吞吐率:4.44req/s ] 内存消耗:4,501.49kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=fa07f0cc809e89840c73c29aab3ac16a
  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.001193s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.001593s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000707s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000722s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.001317s ]
  6. SELECT * FROM `set` [ RunTime:0.000583s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.001509s ]
  8. SELECT * FROM `article` WHERE `id` = 505980 LIMIT 1 [ RunTime:0.001206s ]
  9. UPDATE `article` SET `lasttime` = 1787309758 WHERE `id` = 505980 [ RunTime:0.021833s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 67 LIMIT 1 [ RunTime:0.000771s ]
  11. SELECT * FROM `article` WHERE `id` < 505980 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.001282s ]
  12. SELECT * FROM `article` WHERE `id` > 505980 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.001176s ]
  13. SELECT * FROM `article` WHERE `id` < 505980 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.002688s ]
  14. SELECT * FROM `article` WHERE `id` < 505980 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.002511s ]
  15. SELECT * FROM `article` WHERE `id` < 505980 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.002778s ]
0.229160s