C fork和现有线程?

C fork和现有线程?,c,multithreading,unix,fork,C,Multithreading,Unix,Fork,在linux系统上,子进程是否以与父进程相同的方式查看现有线程 int main() { //create thread 1 int child_pid = fork(); if ( 0 == child_pid) { .. } else { .. } 由于为子进程复制了整个地址空间,线程的状态会发生什么变化。如果上述段中的线程1正在等待条件信号,该怎么办。它在子进程中也处于等待状态吗?线程不是使用fork()从linux系统上

在linux系统上,子进程是否以与父进程相同的方式查看现有线程

int main() {

  //create thread 1

  int child_pid = fork();

  if ( 0 == child_pid)
  {
       ..
  }
  else
  {
       ..
  }

由于为子进程复制了整个地址空间,线程的状态会发生什么变化。如果上述段中的线程1正在等待条件信号,该怎么办。它在子进程中也处于等待状态吗?

线程不是使用fork()从linux系统上的子进程继承的。这里有一个深入的来源:

现在Linux上的线程试图保持POSIX兼容。仅复制调用线程,而不复制其他线程(请注意,例如,在Solaris上,您可以根据链接到的库选择fork的功能)

自2004年起(POSIX):

应创建一个具有 单线程。如果是多线程 进程调用新进程
fork()
应包含呼叫的副本 线程及其整个地址空间, 可能包括美国 互斥体和其他资源。 因此,为了避免错误 子进程只能执行 异步信号安全操作,直到 例如
exec
函数之一的时间 被称为。叉 可以通过以下方式建立处理程序: 中的
pthread\u atfork()函数的
维持申请的命令
跨越
fork()
调用的不变量


POSIX 2018的规范与之类似。

该常见问题解答已非常过时。用户可以看到的最大区别是,自内核2.6和glibc 2.3以来,LinuxThreads已经被NPTL淘汰,它解决了非POSIX类线程行为的所有未决问题。谢谢。这个链接很有帮助。