当前位置: 技术问答>linux和unix
fork的共享问题
来源: 互联网 发布时间:2016-10-07
本文导语: #include #include #include #include #include #include main() { pid_t pid; int rv; switch(pid=fork()) { case -1: perror("fork"); /* something went wrong */ exit(1); /* parent exits */ case 0: printf(" CHILD: This is the child proc...
#include
#include
#include
#include
#include
#include
main()
{
pid_t pid;
int rv;
switch(pid=fork()) {
case -1:
perror("fork"); /* something went wrong */
exit(1); /* parent exits */
case 0:
printf(" CHILD: This is the child process!n");
printf(" CHILD: My PID is %dn", getpid());
printf(" CHILD: My parent's PID is %dn", getppid());
printf(" CHILD: Enter my exit status (make it small): ");
scanf(" %d", &rv);
printf(" CHILD: I'm outta here!n");
exit(rv);
default:
printf("PARENT: This is the parent process!n");
printf("PARENT: My PID is %dn", getpid());
printf("PARENT: My child's PID is %dn", pid);
printf("PARENT: I'm now waiting for my child to exit()...n");
wait(&rv);
printf("PARENT: My child's exit status is: %dn", WEXITSTATUS(rv));
printf("PARENT: I'm outta here!n");
}
}
这段代码子进程和父进程共享了一个rv么??不是说子进程对父进程进行完全的拷贝了么??不太明白。那应该有两个rv吧??
|
没有共享rv.fork函数创建子进程结束后,如果立即终止两个进程,就会看到子进程和父进程有相同的用户栈,相同的本地变量值,相同的堆,相同的全局变量值.然而父进程和子进程是独立的进程,他们每个都有自己的私有地址空间,一个进程对局部变量的修改不会影响到另一个进程。
|
操作系统好像利用了一个“copy on write”的机制,优化性能..
应该开发中无需关心具体细节,就认为在两个进程中他们是不同的变量,互不影响
应该开发中无需关心具体细节,就认为在两个进程中他们是不同的变量,互不影响
|
我的理解就是子进程拥有跟父进程“完全相同”的地址空间,包括全局变量和局部变量(堆栈),这些段之间不是共享的,而是子进程从父进程复制了一份,但是text段可能是共享的。因为各自独立,所以全局变量和局部变量均互不影响。你的程序子进程得到了一个rv值,然后父进程用系统调用wait得到了子进程的退出代码,赋给父进程的rv。我的理解,可能不妥。
|
测试代码:
1 #include
2 #include
3 #include
4
5 int main()
6 {
7 int i=4;
8 pid_t pid;
9 pid=fork();
10 if(pid
1 #include
2 #include
3 #include
4
5 int main()
6 {
7 int i=4;
8 pid_t pid;
9 pid=fork();
10 if(pid