This question already has answers here:
Closed 5 years ago.
Why the address of variable of child process and parent process is same
(2个答案)
根据ideone.com,上述程序的输出是->
我的问题是,如果两个进程都给出了变量“a”的相同地址,那么如果我在一个进程中更改了该值,为什么父进程中没有反映出该更改。
此外,为什么子进程正在运行整个程序,否则它应该在fork()之后使用语句运行。
(2个答案)
#include<stdio.h>
main()
{
int a=9;
printf(" %u hiii \n",&a);
int p=fork();
if(p==0){
a=10;
printf("\nChild %u \n Value in child of a = %d\n",&p,a);
}
else
printf("\nvalue of a = %d \n Parent with child process id = %d address of p = %u \n",a,p,&p);
}
根据ideone.com,上述程序的输出是->
3215698376 hiii
value of a = 9
Parent with child process id = 28150 address of p = 3215698380
3215698376 hiii
Child 3215698380
Value in child of a = 10
我的问题是,如果两个进程都给出了变量“a”的相同地址,那么如果我在一个进程中更改了该值,为什么父进程中没有反映出该更改。
此外,为什么子进程正在运行整个程序,否则它应该在fork()之后使用语句运行。
最佳答案
问题注释中的链接回答了内存地址问题。
对于在父应用程序和子应用程序中都要打印的“hiii”行,由于stdout的缓冲,子应用程序正在打印“hiii”行。在fork()
时,该行仍然缓存在内存中,没有刷新到STDUT,直到下一个PrtTf或程序退出。所以这孩子真的是从岔路开始行刑了。
尝试将setvbuf(stdout, NULL, _IONBF, 0);
添加为程序的第一行(或至少在第一次打印之前),并查看孩子是否仍打印出“hiii”行。
关于c - 在fork()调用期间如何共享用户程序和数据,以及为什么子进程运行未在fork()调用之前完成? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21382139/