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