Linux系统调用(system call)

  • 系统调用以c语言函数调用的方式提供

  • 操作系统内核提供的编程界面

    应用程序(ap)和操作系统(kernel)进行交互的唯一手段。

    例如:文件操作的open,read,write,close

  • 系统调用与库函数在执行上有区别

    库函数在用户态下运行,和可执行文件是一体的,在一个文件中执行。系统调用是调用操作系统里的功能,工作在系统特权状态,使用cpu的INT软中断指令,在操作系统内核完成。

    例如:获取进程ID的getpid()与字符串拷贝函数strcpy()

    CPU的INT指令(软中断)与CALL指令(子程序调用)

  • 库函数对系统调用的封装(API)

    目的:执行效率更高,调用界面更方便

    例如:库函数printf对系统调用write的封装

    库函数malloc/free对系统调用sbrk的封装

  • 整形全局变量errno

    标准库为errno保留存储空间,系统调用失败后填写错误代码,记录失败原因

    #include之后,就可以直接使用变量errno

    errno.h头文件定义了许多有E前缀的宏,例如EACCES,EIO,ENOMEM,EINTR。相关系统调用的手册页中有出错说明

    在man命令给出的手册页中有ERRORS一节介绍出错原因,如man recv

  • strerror

    char *strerror(int errno);

    errno是个整数,便于程序识别错误原因,不便于操作员理解。库函数strerror将数字形式的错误代码转换成一个可阅读的字符串

  • printf的%m

    是printf类函数格式化字符串中的%m会被替换成上次系统调用失败的错误代码对应的消息(message)

你可能感兴趣的:(每日小计,安全)