1、文件描述符
对于内核而言,所有打开的文件都通过文件描述符引用。文件描述符是一个非负整数。当打开一个现有文件或创建一个新文件时,内核向进程返回一个文件描述符。当读或写一个文件时,使用open或creat返回的文件描述符标识该文件,将其作为参数传递给read或write。
2、文件共享
父子进程对同一个文件使用了同一个文件偏移量。如果父子进程写到同一个文件描述符,但没有任何形式的同步那么他们的输出就会相互混合,在fork之后处理文件描述符有两种情况:
- 父进程等待子进程完成。在这种情况下,父进程无须对其描述符做任何处理。当子进程终止后,它曾进行过读、写的一个共享描述符的文件偏移量已经执行了相应的的更新。
父子进程各自执行不同的程序段。这种情况下,在fork之后,父子进程各自关闭他们不需要使用的文件描述符,这样就不会干扰对方使用的文件描述符。
3、系统调用与库函数的区别
库函数:语言本身带的库文件,其中是特定功能的实现。函数调用是在用户态,逻辑实践也是在用户态。
系统调用函数操作系统内核提供给外层访问的一些接口函数,调用在用户态,实现实现在内核态。
4、系统调用的执行过程
系统调用函数触发0x80中断,并且将系统调用号存储在eax寄存器中,然后陷插入内核,内核开始执行中断处理程序,在系统调用表中查找系统调用号对应的内核函数并调用,执行完成后又将返回值通过 eax寄存器传递会用户空间。
5、用户态和内核态的区别
用户态(也称内目态)——操作系统在系统态运行——运行操作系统程序
内核态(也称内管态或核心态)——应用程序只能在用户态运行——运行用户程序