使用fork()为线程应用程序提供背景

时间:2011-02-07 23:15:12

标签: c linux multithreading pthreads fork

所以我有一个使用线程的应用程序。现在当程序第一次启动时,我希望它在设置数据库连接之前进行设置,然后才能启动程序,无论启动程序是谁,都可以知道启动时是否有错误。

我做了一些环顾四周并发现了一些资源,说'不要混合使用fork和threads',而有些人说在linux中分叉只会复制主线程并让其他人独立。
对于后者(它只是复制主线程),线程如何访问文件级(全局)变量?线程是否无法访问现在位于分叉进程的地址空间中的变量?

最终目标是在创建线程后自己拥有应用程序背景。如果这是不可能的,我可以在创建线程之前放置fork,只是想尽可能晚地完成。

注意:在fork时,线程将执行sleep()循环,直到主线程将数据放入共享变量供他们处理。因此,如果睡眠中断,他们就不会受到伤害。

3 个答案:

答案 0 :(得分:3)

作为fork的一部分,无法复制线程,并且父节点的线程将在父节点退出时终止,因此即使它们可以访问子节点的内存,也无法帮助您。您需要在分叉后创建线程,或使用pthread_atfork注册将在子进程中重新创建它们的处理程序。我建议等到分叉后再创建你的线程,因为它更简单,更有效。

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

答案 1 :(得分:0)

分叉进程会创建两个不同的进程,并且一个进程中的线程将无法访问第二个进程中的内存。如果你想让不同的进程访问同一个内存,你需要一个叫做共享内存的东西。

答案 2 :(得分:0)

当进程中的线程调用fork()时,通过复制(1)进程的完整地址空间和(2)调用{的(一个)线程来创建新进程。 {1}}。如果进程中还有其他线程,则不会复制它们。这几乎肯定会导致程序中的错误。因此建议不要混合线程和分叉。

如果要创建包含多个线程的后台进程,必须在生成任何其他线程之前对其进行分叉。然后,这两个进程表现正常,就像任何两个独立进程一样:一个进程内的线程共享相同的内存,但是后台线程和前台进程不共享任何内存(默认情况下)。