Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 分叉后,全局变量是否共享?_C_Linux_Unix_Fork - Fatal编程技术网

C 分叉后,全局变量是否共享?

C 分叉后,全局变量是否共享?,c,linux,unix,fork,C,Linux,Unix,Fork,考虑以下简单代码: int myvar = 0; int main() { if (fork()>0) { myvar++; } else { // father do nothing } } 当child递增myvar时,该值是否与父级共享(如pthread)?否,因为除非实现某种IPC机制,否则全局变量不会在进程之间共享。将复制内存空间。因此,两个进程中的全局变量在fork之后立即具有相同的值,但如果一个进程更改了它,另

考虑以下简单代码:

 int myvar = 0;
 int main() {
     if (fork()>0) {
       myvar++;
     } else {
       // father do nothing
     }
 }

当child递增myvar时,该值是否与父级共享(如pthread)?

否,因为除非实现某种IPC机制,否则全局变量不会在进程之间共享。将复制内存空间。因此,两个进程中的全局变量在fork之后立即具有相同的值,但如果一个进程更改了它,另一个进程将看不到它的更改

另一方面,线程确实共享全局变量。

fork()
ing在分叉时创建父进程的精确副本。但是,在
fork()
完成后,子对象的存在方式将完全不同,并且不会向父对象报告

换句话说,否,父项的全局变量不会因子项的更改而改变。

否和是

不,它们不会以程序员可见的任何方式共享;这些进程可以独立地修改它们自己的变量副本,并且它们的更改不会对其他进程(即fork()父进程、同级进程或子进程)产生任何明显的影响

但是,是的,操作系统最初确实共享页面,因为fork实现了写时复制,这意味着如果没有任何进程修改页面,那么它们是共享的。然而,这是一个可以忽略的优化


如果您想要共享变量,请将它们放在匿名共享映射中(请参见mmap()),在这种情况下,它们将真正得到共享,并附带所有的注意事项。

在fork()之后,整个过程(包括所有全局变量)将被复制。子级是父级的精确副本,只是它有不同的PID(进程Id)、不同的父级,并且fork()返回0。全局变量在其自身的过程中仍然是全局的。因此答案是否定的,在调用fork()之后,全局变量不会在进程之间共享。

我同意Tom的观点。您可以只输出两个过程的值,然后自己看看输出是什么。尽管记得睡在一个不期望myvar增加的进程中,这样它就不会在另一个进程(尽管不会)增加myvar之前执行。但是,是的,运行它看看。注意误导性的评论:实际上,父进程增加计数器(除非fork失败),子进程除了立即退出之外什么都不做。首先,你没有检查失败。第二,只有文件描述符是共享的。+1尽管我认为“完全不同的存在”可能会产生误导,因为某些对象(如文件句柄)可能在不同的情况下共享,IIRC。没错,由于“精确副本”,每个进程对任何共享资源(文件、管道等)都有自己的句柄。事实上,与打开同一文件的两个单独进程没有太大区别。打开同一文件的两个进程与共享分叉前创建的文件描述符的两个进程之间有一个关键区别:分叉的进程共享相同的打开文件描述和偏移量;如果一个进程移动文件指针(通过读取、写入或查找),它也会影响另一个进程。单独打开时不会发生这种情况,因为它们具有单独的打开文件描述。请参阅:open()、fork()、lseek()等。谢谢,我不知道。或者,如果我知道的话,我忘了。我已经很久没有使用fork()了。变量是否为全局变量并不重要。@tchrist我知道,我提到全局变量是因为它似乎是op所担心的。您确定这部分
全局变量可以在父进程和子进程之间共享吗?