fork

来源:互联网 发布:淘宝怎么下载 编辑:程序博客网 时间:2024/05/21 09:36

当要创建一个子进程的时候就用fork()函数,它一般有两种应用,

 

第一,创建一个子进程用来执行和父进程不同的代码段,这个在网络中应用比较广,比如服务器端fork一个子进程用来等待客户端的请求,当请求到来时,子进程响应这个请求,而父进程则继续等待客户端请求的到来;

 

第二,创建一个子进程用来执行和父进程不同的程序,这种应用往往 fork一个子进程之后立即调用exec族函数,exec族函数则调用新的程序来代替新创建的子进程。

 

 

在main函数的开头不是有一条语句是这样的:
static   inline   _syscall0(int,fork)
需要结合到unistd.h文件中的宏_syscall0来看上面一句代码
把unistd.h文件中的宏_syscall0看懂了,再看懂static   inline   _syscall0(int,fork)就明白了
提示一下:
static   inline   _syscall0(int,fork)就是通过宏_syscall0替换后,就变成fork函数的实现了,也就是你所说的为何没有在什么地方看到fork的实现


最终经过编译以后,(即变成image文件后)对于机器来说,就是二进制组成的文件,也就是所说的bin文件,而ELF文件还会有文件头的概念。

内核代码里面,如time.h中声明了很多方法的原型,
char   *   ctime(const   time_t   *   tp);
struct   tm   *   gmtime(const   time_t   *tp);
这些函数就如同你所遇到的fork一样,它也是通过宏扩展之后,在调用之处才是其实现之处,你仔细看一下那几个宏声明。这里只所以声明函数原型,就是为了让其它地方好调用而已,至于在其它地方有没有被实现,主要是看有没有像在main函数内的fork那样相似的方法处理过的。
内核是自成一体的代码,它不能动态连接任何动态库,而内核又需要做到精减,所以它也不能去连接C库。所以不能使用任何第三方库的函数,只能是自成一体的,内核所用到的函数必须都要自己去实现,用到的结构都是自己去声明,最初的堆栈指针都是在汇编代码阶段时去设置的

原创粉丝点击