You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言中如何为atexit()内的函数传递参数?

问题描述

我有一个用于释放资源并从网络注销的函数:

void UNREG_on_exit(COT_arguments args, Node_Information *node)

希望程序退出时(包括按Ctrl+C终止)自动调用该函数,但不知道如何传递参数。此前从未使用过函数指针,尝试了两种写法都报错,错误提示为“expected an identifier”,参数下方出现红线:

// 写法一
void UNREG_on_exit(args, &node); // 这样是创建函数指针吗?
atexit(UNREG_on_exit);

// 写法二
atexit((void) {
    UNREG_on_exit(args, &node); // 还是这样?
});

附加结构体定义:

typedef struct Node_Information
{
    int id;
    int net;
    Backup bck;
    Extern ext;
    Intern *intern_list;
    int InNetword;
    int debug_mode;
    int IsREGED;
    int fd;
    Table *table_list;
    StringList *contents_list;
    PendingConnections *pending_connections_list;
    QueryList *query_list;

} Node_Information;

typedef struct COT_arguments
{
    char *IP;
    int TCP;
    char *reg_IP;
    int reg_UDP;
} COT_arguments;
解决方案

为什么之前的写法错误

atexit函数要求传入的是无参数、无返回值的函数指针(类型为void (*)(void)),而你的UNREG_on_exit带有两个参数,直接传递或者用匿名代码块的写法都不符合语法要求,因此报错。

正确实现步骤

1. 用包装函数+全局/静态变量传递参数

因为atexit的回调无法直接接收参数,我们可以把需要传递的args和node指针存储到全局或静态变量中,再写一个无参数的包装函数,在包装函数里调用目标函数:

// 定义静态全局变量存储参数(避免污染全局命名空间)
static COT_arguments g_exit_args;
static Node_Information *g_exit_node;

// 无参数的包装函数
void UNREG_wrapper(void) {
    UNREG_on_exit(g_exit_args, g_exit_node);
}

// 在程序初始化完成后,给全局变量赋值
// 示例:假设args和node已经初始化完成
g_exit_args = args;
g_exit_node = &node; // 注意:如果node是局部变量,要确保它的生命周期覆盖到程序退出

// 注册退出回调
atexit(UNREG_wrapper);

2. 处理Ctrl+C(SIGINT信号)的情况

atexit默认只处理正常退出(比如main函数返回、调用exit()),而Ctrl+C触发的是SIGINT信号,需要额外注册信号处理函数,在信号处理中调用exit()来触发atexit的回调:

#include <signal.h>
#include <stdlib.h>

void sigint_handler(int sig) {
    // 可选:在这里做一些紧急清理操作(注意信号处理函数中只能调用异步安全函数)
    exit(EXIT_FAILURE); // 调用exit会触发atexit注册的所有回调
}

// 在程序启动时注册信号处理
signal(SIGINT, sigint_handler);

注意事项

  • 如果node是局部变量,要确保它的内存在程序退出前不会被释放,否则建议改用全局变量或者动态分配内存。
  • 信号处理函数中尽量只执行简单操作,exit()是符合异步信号安全要求的函数,可以放心调用。

内容的提问来源于stack exchange,提问作者Filipe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 13:30:14