问题提出:回想一下:当一个程序只有主线程的时候调用fork,此时fork会创建出的子进程也会只有一条线程; 那要是把fork放入多线程的程序中呢? 我们来试验下:
情况(1)fork在创建子线程之前代码: #include <stdio.h>#include <pthread.h>#include <unistd.h>void* pthread_fun(void* arg){ printf("fun = %d/n", getpid()); pthread_exit(NULL);}int main(){ fork(); pthread_t id; pthread_create(&id, NULL, pthread_fun, NULL); printf("main_pid = %d/n", getpid()); pthread_join(id, NULL); return 0;} 结果:fork出的子进程也会创建自己的子线程(两个进程:四个线程 ) 
情况(2)fork在创建子线程之后代码: #include <stdio.h>#include <pthread.h>#include <unistd.h>void* pthread_fun(void* arg){ printf("fun = %d/n", getpid()); pthread_exit(NULL);}int main(){ pthread_t id; pthread_create(&id, NULL, pthread_fun, NULL); fork(); printf("main_pid = %d/n", getpid()); pthread_join(id, NULL); return 0;} 结果:创建子线程之后,再创建子进程,此时fork的子进程只会执行fork之后的代码(两个进程:三个线程 ) 
情况(3)子线程中的fork代码: #include <stdio.h>#include <pthread.h>#include <unistd.h>void* pthread_fun(void* arg){ fork(); printf("fun = %d/n", getpid()); pthread_exit(NULL);}int main(){ pthread_t id; pthread_create(&id, NULL, pthread_fun, NULL); printf("main_pid = %d/n", getpid()); pthread_join(id, NULL); return 0;} 结果: 
结论:fork处于哪个线程中,fork后创建的子进程将以该线程作为自己的主线程,并且执行该线程之后的代码 下载地址: linux下AutoFs挂载服务安装教程 Docker跨服务器通信Overlay解决方案(上)之 Consul单实例 |