在linux系统上,子进程是否以与父进程相同的方式查看现有线程?
int main() {
//create thread 1
int child_pid = fork();
if ( 0 == child_pid)
{
..
}
else
{
..
}由于为子进程复制了整个地址空间,因此线程的状态会发生什么变化。如果上述代码段中的线程1正在等待条件信号,该怎么办?它在子进程中是否也处于等待状态?
发布于 2009-07-02 14:20:00
如今,Linux上的线程试图保持POSIX兼容。只复制调用线程,而不复制其他线程(请注意,在Solaris上,您可以根据链接到的库来选择fork的作用)
来自http://www.opengroup.org/onlinepubs/000095399/functions/fork.html (POSIX2004):
应使用单线程创建进程。如果多线程进程调用
fork(),则新进程应包含调用线程的副本及其整个地址空间,可能包括互斥和其他资源的状态。因此,为了避免错误,子进程可以仅执行异步信号安全操作,直到调用exec函数之一时为止。为了维护跨fork()调用的应用程序不变量,可以通过pthread_atfork()函数来建立分叉处理程序。
fork()的POSIX2018规范与此类似。
发布于 2009-07-02 13:00:40
线程不是使用fork()从linux系统上的子进程继承而来的。这里有一个深入的来源:http://linas.org/linux/threads-faq.html
https://stackoverflow.com/questions/1073954
复制相似问题