当前位置: 技术问答>linux和unix
关于linux的fork的另一个小问题,详细见下面的代码,谢了~
来源: 互联网 发布时间:2017-05-02
本文导语: 先表示感谢,然后是问题: 代码(源自《linux程序设计(第四版)》P398): #include"sys/types.h" #include"unistd.h" #include"stdio.h" #include"stdlib.h" int main() { pid_t pid; char *message; int n; printf("fork program startingn"); pid = fork...
先表示感谢,然后是问题:
代码(源自《linux程序设计(第四版)》P398):
初识进程,所以问点儿白痴问题,请见谅~;
运行这个程序后,父进程和子进程会同时进行、父进程输出了3次自己的内容、子进程输出了5次自己的内容;
问题:
为什么会产生两个不同的n值,既pid只有一个确定的值,那么switch(pid)之后应该只会进入到pid中的一个选项中去呀,那么新进程创建成功后、返回pid为0、那么n==5,怎么还会==3呢?
自己的理解:
1>fork函数是,开始产生一个新的进程、加上一开始有的那个进程、会有两个进程;
2>fork对上面产生的两个进程、分别返回不用的值;
1)对于父进程、返回的是一个PID、是子进程的PID;
2)对于子进程、返回的是一个0,表示创建成功;
所以,若按照上面这两点理解的话、那么上述代码理所当然的会有这样的输出结果(父子进程并发执行、来输出结果)。
我自己的理解对么0.0,除了课本没有师傅的弱菜谢过了
代码(源自《linux程序设计(第四版)》P398):
#include"sys/types.h"
#include"unistd.h"
#include"stdio.h"
#include"stdlib.h"
int main()
{
pid_t pid;
char *message;
int n;
printf("fork program startingn");
pid = fork();
switch(pid)
{
case -1:
perror("fork failed");
exit(1);
case 0:
message = "This is the child";
n = 5;
break;
default:
message = "This is the parent";
n = 3;
break;
}
for(; n > 0; n--){
puts(message);
sleep(1);
}
exit(0);
}
初识进程,所以问点儿白痴问题,请见谅~;
运行这个程序后,父进程和子进程会同时进行、父进程输出了3次自己的内容、子进程输出了5次自己的内容;
问题:
为什么会产生两个不同的n值,既pid只有一个确定的值,那么switch(pid)之后应该只会进入到pid中的一个选项中去呀,那么新进程创建成功后、返回pid为0、那么n==5,怎么还会==3呢?
自己的理解:
1>fork函数是,开始产生一个新的进程、加上一开始有的那个进程、会有两个进程;
2>fork对上面产生的两个进程、分别返回不用的值;
1)对于父进程、返回的是一个PID、是子进程的PID;
2)对于子进程、返回的是一个0,表示创建成功;
所以,若按照上面这两点理解的话、那么上述代码理所当然的会有这样的输出结果(父子进程并发执行、来输出结果)。
我自己的理解对么0.0,除了课本没有师傅的弱菜谢过了
|
在fork()处就开始分叉了
在父进程中pid=子进程id,执行default
在子进程中pid=0,执行case 0
在父进程中pid=子进程id,执行default
在子进程中pid=0,执行case 0
|
恩,楼主的理解是对的,
fork执行完,下面的代码,父子进程都会同时执行一遍,同时子进程会复制父进程堆、栈、全局局域的内存(写时复制)
fork执行完,下面的代码,父子进程都会同时执行一遍,同时子进程会复制父进程堆、栈、全局局域的内存(写时复制)