16

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

int main() {

  //create thread 1

  int child_pid = fork();

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

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

4

2 回答 2

21

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

来自http://www.opengroup.org/onlinepubs/000095399/functions/fork.html(POSIX 2004):

应使用单个线程创建进程。如果多线程进程调用fork(),新进程应包含调用线程及其整个地址空间的副本,可能包括互斥锁和其他资源的状态。因此,为了避免错误,子进程只能执行异步信号安全操作,直到exec调用其中一个函数。可以通过该pthread_atfork()函数建立分叉处理程序,以便在fork()调用之间保持应用程序不变量。

POSIX 2018 规范fork()是类似的。

于 2009-07-02T14:19:59.667 回答
1

线程不是使用 fork() 从 linux 系统上的子进程继承的。一个深入的来源在这里: http: //linas.org/linux/threads-faq.html

于 2009-07-02T13:00:40.170 回答