您的位置:首页 > 职场人生

从一个面试题,看fork()函数

2015-08-09 21:49 459 查看
今天试着,做了一些360的面试题。 ===== 表示过两天有360的在线比赛,有压力。

<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作者肯定不会傻到这种程度
哎呀,纠结了一天的问题,终于豁然开朗了,心情就是爽!

=====》

结论就是:

子进程是对父进程的完全的拷贝,不仅仅的程序,还有程序的运行状态。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: