今天看书,看到用fork创建子进程的一段样例代码:
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main(void)
{
pid_t pid;
char* msg;
int k;
printf("Process Creation Study\n");
pid = fork();
switch(pid){
case 0:
msg = "Child process is running";
k = 3;
break;
case -1:
perror("Process creation failed\n");
break;
default:
msg = "Parent process is running";
k = 5;
break;
}
while(k)
{
puts(msg);
sleep(1);
printf("msg's adress is %p,k's aress is %p,k = %d,PID = %d\n",&msg,&k,k,pid);
--k;
}
return 0;
}
很多疑惑,逐一记录解决
1 为什么同一个switch会执行了两次呢?
2 Parent确实执行了5次输出,child也确实3次输出,为什么同一变量能存两个不同的值呢!?
在while中加入哪条输出变量地址和值的输出语句后表面看来确实是同一内存块存储了两个不同的值,怎么解释?
各方搜集资料调试打印之后得出结果:
首先子进程会继承父进程的很多属性,而非共享,再复制了父进程数据之后,2者就基本没有关系了。
fork函数和一般的函数不同,在他成功创建出子进程之后会返回两个值,一个返回给父进程中的pid变量(值为子进程ID),一个返回给自进程中的pid变量(值为0)
当然,如果fork失败了,则只需要返回给父进程pid变量一个-1(子进程不存在).