Linux下fork()后生成的两个进程对于全局变量也是两个副本吗?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux下fork()后生成的两个进程对于全局变量也是两个副本吗?相关的知识,希望对你有一定的参考价值。

我知道在函数内部定义的变量,fork()后会有两个副本,那么全局变量呢?

fork()创建的是进程不是线程,他们的整个虚拟存储空间都是相互独立的,当然都是有副本的。函数内部定义的局部变量放在栈中,而全局变量则是放在.data或者.bss段中,他们都有副本。包括你的代码段.text也是有副本的。
当然linux内核为了节省内存/提高执行速度可以采用copy on write技术,也就是只有当某个进程要写入一个页面的时候才进行拷贝副本操作。不过这对应用程序都是透明的,不可见的。
参考技术A fork()产生自身的一个副本线程以后继续运行,产生的线程属于子线程,拥有自己的堆栈,所有的变量都会拥有其副本. 我想应该包括全局变量吧.

//上面的错误我就不修改了... 作历史纪录

michael_fu 说的没错, 产生的是新进程(Process)而不是新线程(Thread). 这是我的笔误.

Linux下进程的创建(system(); fork(); exec*())

0. system();

system()函数通过调用shell程序来执行所指向的命令(效率低),相当于先fork(),再execve();
特点:原进程和子进程各自运行,且原进程需要等子进程运行完后再继续;
 

1. fork();

参考文献: linux中fork同时创建多个子进程的方法(一)

在Linux中用fork()由一个父进程创建同时多个子进程的格式如下:

 1 int status,idx;
 2 
 3 for (idx = 0; idx < 10; idx++) {
 4   status = fork();
 5   if (status == 0 || status == -1) break;  // 每次循环时,如果发现是子进程就直接从创建子进程的循环中跳出来,不让你进入循环,这样就保证了每次只有父进程来做循环创建子进程的工作
 6 }
 7 
 8 if (status == -1) {
 9   //error
10 } else if (status == 0) {  // 每个子进程都会执行的代码
11   //sub process
12 } else {
13   //parent process
14 }

 参考文献:进程控制:linux中fork同时创建多个子进程注意事项

    /* 这里不可以一下就创建完子进程,要用 
    *要 创建-》判断-》使用-》return or exit.更不能这样如test2.c 
    *childpid1 = fork(); 
    *childpid2 = fork(); 
    *childpid3 = fork(); 
    */  
    childpid1 = fork();                                             //创建  
    if(0 == childpid1)                                              //判断  
    {                                                               //进入  
        printf("In child1 process\n");  
        printf("\tchild pid = %d\n", getpid());  
        exit(EXIT_SUCCESS);                                         //退出  
    }  

 

2. exec*();

参考文献:

linux系统编程之进程(五):exec系列函数

Linux下execl学习

编译中出现的错误:

使用execl()函数时出现warning: not enough variables to fit a sentinel

解决方法 - 调整execl中的参数

以上是关于Linux下fork()后生成的两个进程对于全局变量也是两个副本吗?的主要内容,如果未能解决你的问题,请参考以下文章

linux下fork两子进程为啥只有一个读取到pipe的内容?

Linux进程控制

fork函数

linux系统编程:进程控制(fork)

Linux-进程控制

Linux-进程控制