gpt4 book ai didi

c - 变量可用于两个函数而无需在 C 中全局化

转载 作者:太空宇宙 更新时间:2023-11-04 03:00:57 25 4
gpt4 key购买 nike

有没有办法让两个函数共享一个变量,而不是让它成为全局变量并且不能传递它?或者有没有办法在使用 signal() 时将变量传递给函数?

具体来说,我有一个 main() 打开一个文件并处理它并保持它打开一段时间。有一个小函数在处理完文件后接受 fd(和一些其他信息)main() 调用。

我现在正试图通过捕获致命信号并在需要时处理事情来使事情变得更加健壮。尽管我不知道如何在不使 fd 和所有其他需要的变量成为全局变量的情况下做到这一点。我宁愿避免的事情。

(void)signal(SIGINT, die);

static void die(int sig)
{
endTrip(fd, &tripID); //Quickly writes a footer and fcloses
exit(sig);
}

有比全局化更好的解决方案吗?

编辑

这样的事情可能吗

static void die(int sig, FILE *fd)
{
const FILE *local_fd;
if(sig == NULL)
{local_fd = fd;}
else
{
endTrip(local_fd, &tripID); //Quickly writes a footer and fcloses
exit(sig);
}
}


main() {
...
// When i open new file let die know.
die(NULL, fd);
...
}

最佳答案

信号处理程序已经是全局状态。如果您正在使用一个,那么您已经过了不归路,并且您已经在使用一个全局变量,尽管它通常隐藏在内核空间(信号处理程序指针)中。在这一点上,为参数添加另一个全局变量并完成它并没有什么大不了的。

话虽如此,您可能应该考虑您的整个设计是否有效。从信号处理程序使用 stdio 是无效的,除非在非常特殊的情况下很难保证。在您的情况下,由于被信号处理程序中断的代码似乎在同一 FILE 流上运行,因此从信号处理程序中触摸它几乎肯定是无效的。

另外,您可能会考虑如果您的程序是多线程的,或者曾经被改编为多线程的,会发生什么情况。整个过程只有一组信号处理程序,但可能会在不同的线程中写入多个文件。

您可以采用多种不同的方法来解决此类问题,但最简单和最便携的方法是打开一个返回给您自己的管道,让信号处理程序只向管道写入一个字节。然后你的主循环代码可以检测管道读取端的输入(例如,使用 selectpoll)并在信号处理程序上下文之外对其进行操作,在它自己的上下文,它可以访问自己的局部变量等。

关于c - 变量可用于两个函数而无需在 C 中全局化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12066513/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com