从一个面试题,看fork()函数
2015-08-09 21:49
459 查看
今天试着,做了一些360的面试题。 ===== 表示过两天有360的在线比赛,有压力。
又一次看到了fork()这个函数。应该补充一些这方面的知识了。
其实,自己也对这个函数有很多的误解。搜了一下,这个函数才有点认识。
下文转载自:http://blog.chinaunix.net/uid-26983585-id-3220056.html
#include<stdio.h>
#include<sys/types.h>
void do_something()
{
printf("hello !i'm the child process!\n");
}
void main_dosomething()
{
printf("hello!i'm the main\n");
}
void main()
{
pid_t pid;
int i=0;
main_dosomething();
pid=fork();
switch(pid)
{
case 0:
do_something();
case
-1:
printf("error!\n");
return ;
default:
printf("hi ,i'm the father process!\n");
}
}
开始就是不明白为什么子进程不会调用main_dosomething()函数了,我就是认为所有的程序都是从main函数开始执行,所以理应子进程也应该从main函数执行,所以才错误的认为子进程会调用main_dosomething()函数。
哎呀,一直傻不拉几的以为,子进程会执行父进程所有的代码,就是我因为错误的理解了一句话“子进程是父进程的完全拷贝”,这句话,理解错的原因是因为认为拷贝只是简单的“父进程程序的拷贝”,其实子进程拷贝父进程,包括拷贝父进程的一切有关信息,包括状态信息,当然就有程序计数器PC也在内了,所以在父进程执行到fork的时候,它的程序计数器的PC内容绝对不会是从main函数开头执行的了,其实PC此时存放的是进程下一条要执行的指令地址,所以子进程总是从fork之后开始执行。
所以一定要正确的理解进程的“动态”,所谓的动态就是体现在这儿了。
但是子进程和父进程的数据段是独立的,代码段是共享的。
一个简单的想法就是:
fork确实创建了一个子进程并完全复制父进程,但是子进程是从fork后面那个指令开始执行的。
对于原因也很合逻辑,如果子进程也从main开头到尾执行所有指令,那它执行到fork指令时也必定会创建一个子子进程,如此下去这个小小的程序就可以创建无数多个进程可以把你的电脑搞瘫痪
所以fork作者肯定不会傻到这种程度
哎呀,纠结了一天的问题,终于豁然开朗了,心情就是爽!
=====》
结论就是:
子进程是对父进程的完全的拷贝,不仅仅的程序,还有程序的运行状态。
<span style="font-size:18px;">for (int i = 0; i < 2; i++) { fork(); printf("-\n"); } // 问会输出多少个 - </span>
又一次看到了fork()这个函数。应该补充一些这方面的知识了。
其实,自己也对这个函数有很多的误解。搜了一下,这个函数才有点认识。
下文转载自:http://blog.chinaunix.net/uid-26983585-id-3220056.html
#include<stdio.h>
#include<sys/types.h>
void do_something()
{
printf("hello !i'm the child process!\n");
}
void main_dosomething()
{
printf("hello!i'm the main\n");
}
void main()
{
pid_t pid;
int i=0;
main_dosomething();
pid=fork();
switch(pid)
{
case 0:
do_something();
case
-1:
printf("error!\n");
return ;
default:
printf("hi ,i'm the father process!\n");
}
}
开始就是不明白为什么子进程不会调用main_dosomething()函数了,我就是认为所有的程序都是从main函数开始执行,所以理应子进程也应该从main函数执行,所以才错误的认为子进程会调用main_dosomething()函数。
哎呀,一直傻不拉几的以为,子进程会执行父进程所有的代码,就是我因为错误的理解了一句话“子进程是父进程的完全拷贝”,这句话,理解错的原因是因为认为拷贝只是简单的“父进程程序的拷贝”,其实子进程拷贝父进程,包括拷贝父进程的一切有关信息,包括状态信息,当然就有程序计数器PC也在内了,所以在父进程执行到fork的时候,它的程序计数器的PC内容绝对不会是从main函数开头执行的了,其实PC此时存放的是进程下一条要执行的指令地址,所以子进程总是从fork之后开始执行。
所以一定要正确的理解进程的“动态”,所谓的动态就是体现在这儿了。
但是子进程和父进程的数据段是独立的,代码段是共享的。
一个简单的想法就是:
fork确实创建了一个子进程并完全复制父进程,但是子进程是从fork后面那个指令开始执行的。
对于原因也很合逻辑,如果子进程也从main开头到尾执行所有指令,那它执行到fork指令时也必定会创建一个子子进程,如此下去这个小小的程序就可以创建无数多个进程可以把你的电脑搞瘫痪
所以fork作者肯定不会傻到这种程度
哎呀,纠结了一天的问题,终于豁然开朗了,心情就是爽!
=====》
结论就是:
子进程是对父进程的完全的拷贝,不仅仅的程序,还有程序的运行状态。
相关文章推荐
- 黑马程序员-----java基础之运算符----与(&)、或(|)、非(!)、异或(^)、短路与(&&)等
- 剑指Offer面试题37(Java版):两个链表的第一个公共结点
- 百度 腾讯 阿里UC 迅雷 部分Android笔试 面试题
- 黑马程序员——Java基础---集合(一)---Collection、set、list
- 判断一个数中有多少个1
- 20个高级Java面试题汇总
- 关注程序员健康
- 剑指offer_面试题14_调整数组顺序使奇数位于偶数前面(函数指针用法)
- 顿悟,职业生涯最重要的是行业水平的积累,而不是多学某一门语言(很危险)——遥想铁血强人刘志军对铁路行业的理解以及执行力
- 剑指offer_面试题15_链表中倒数第k个节点(考虑问题要全面)
- 黑马程序员---Foundation - NSString
- 剑指Offer面试题36(Java版):数组中的逆序对
- 黑马程序员---oc block
- Java笔试面试题004
- 程序员的谈判技巧
- 黑马程序员 oc随记 写一个手动内存释放
- 两会最新消息:两会时间看全面深化改革“关键棋”
- 2015公务员工资改革消息:广州人社局长称基层公务员工资肯定会增不少
- Hadoop 之面试题
- 黑马程序员——Java基础---多线程