一、fork()函数:
<1>创建虚拟空间
<2>进行映射
<3>确定入口
fork在创建子进程后,并没有给它的子进程分配它所需要的物理内存,而是仅仅复制了虚拟内存空间。当要给进程写变量的时候,这时候才给进程分配相应的物理内存。
将进程的开始地址,结束地址赋给存储至结构体,从而确定物理内存。
整个过程相当于:进程->虚拟空间->实际物理空间。
二、内核
<1> 官方定义
内核是操作系统最基本的部分。它是为众多应用程序提供对计算机硬件的安全访问的一部分软件,这种访问是有限的,并且内核决定一个程序在什么时候对某部分硬件操作多长时间。
<2>内核存在的意义
1、对硬件资源进行管理
2、对软件进行管理
3、具有安全性
安全性:内核只允许低特权级向高特权级请求。(如果内核没有这样的规定,那么电脑就会执行低特权级发出的任何命令,极度缺乏安全性)
<3> 宏内核与微内核
如果要完成一个操作,将指令发送给宏内核与微内核,二者的处理方式是不同的:
宏内核接收到指令后会调用自己内部的模块去处理指令,相当于宏内核接受指令后会都自己去处理。而微内核在接收到指令后是将指令交给别的模块去完成,微内核能自身完成的任务很少。
三、printf函数的实现
printf函数的原型:
int printf(const char* format ...) 第一个参数是const字符串指针
实现代码:
#include <stdio.h>
#include <stdlib.h>
#include<stdarg.h>//定义成一个可变参数列表的指针
void _printf(const char * format,...)
{
va_list ap; //va_list定义的是字符型指针
char ch;
va_start(ap,format); //va_start,是使ap指针指向变参函数中的下一个参数,ap=format-sizeof(format)
while(ch=*format++) // 跳过%,指向%后的参数
{
switch(ch)
{
case 'c':
{
、char ch1= va_arg(ap,char); //va_arg(ap,char)获得ap指向参数的值,同时使ap指向下一个参数,char用来指名当前参数类型
putchar(ch1);
break;
}
case 's':
{
char *p =va_arg(ap,char *);
fputs(p,stdout);
break;
}
default:
putchar(ch);
}
}
}
main()
{
_printf("Hello world!/n","jenjien!");
return 0;
}
va_start(ap,A),初始化参数指针ap,将函数参数A右边右边第一个参数地
址赋值给ap,A必须是一个参数的指针,所以,此种类型函数至少要有一个普通的参数
,从而提供给va_start ,这样va_start才能找到可变参数在栈上的位置。