gpt4 book ai didi

c - 使用 fork() 作为线程应用程序的后台

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:00:59 24 4
gpt4 key购买 nike

所以我有一个使用线程的应用程序。现在,当程序首次启动时,我希望它在后台运行之前完成数据库连接设置和诸如此类的事情,以便启动程序的任何人/任何人都可以知道启动是否有错误。

我环顾四周,发现一些资源说“不要混合使用 fork 和线程”,而其他人则说在 Linux 中 fork 只会复制主线程而不会影响其他线程。
在后者的情况下(它只是复制主线程),线程如何访问文件级(全局)变量?线程将无法访问现在位于 fork 进程地址空间中的变量吗?

最终目标是在创建线程后让应用程序在后台运行。如果这不可能,我可以在线程创建之前放置 fork,只是想尽可能晚地进行。

注意:在fork的时候,线程会做一个sleep()循环,直到主线程把数据放到一个共享变量中让它们处理。因此,即使 sleep 被打扰,他们也不会受到伤害。

最佳答案

没有办法复制线程作为fork的一部分,当父线程退出时,父线程将全部终止,所以即使它们可以访问子线程的内存,也无济于事你。您需要在 fork 后创建您的线程,或者使用 pthread_atfork 注册将在子进程中重新创建它们的处理程序。我建议等到 fork 之后再创建您的线程,因为它更简单、更高效。

为什么要尽可能地延迟 fork ?如果你想在初始化完成之前保持与终端或其他东西的连接,你可以让父进程等待终止,直到子进程(及其线程)完成初始化并准备好“在后台”。可以使用各种同步工具来实现这一点。一个简单的方法是打开一个管道,子级通过该管道将其输出发送回父级进行显示;当父级在此管道上收到 EOF 时,它可以简单地退出。

关于c - 使用 fork() 作为线程应用程序的后台,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4927823/

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