系统调用与函数调用

Ank*_*kur 29 c system-calls function-calls

系统调用和函数调用有什么区别?fopen()是系统调用还是函数调用?

Tho*_*mas 32

系统调用是对内核代码的调用,通常通过执行中断来执行.中断导致内核接管并执行请求的操作,然后将控制权交还给应用程序.此模式切换是系统调用执行速度比等效应用程序级函数慢的原因.

fopen是C库中的一个函数,它在内部执行一个或多个系统调用.通常,作为C程序员,您很少需要使用系统调用,因为C库会为您包装它们.

  • 对.`fopen()`可能比自己做系统调用稍微慢一点,但是通过使用`fopen()`你可以获得可移植性,可读性和可维护性. (3认同)
  • @adityah 是的,在像“fwrite”这样的调用的情况下,缓冲可以使 C 库调用比直接使用系统调用更快。但对于“fopen”,这不适用。 (2认同)

Tom*_*Tom 9

fopen是一个函数调用.

系统调用与管理资源的底层OS交互.它的数量级比函数调用更昂贵,因为必须采取许多步骤来保持进行系统调用的进程状态.

在*nix系统上,fopen打开,这使得系统调用(open是系统调用的C - 包装器).fread/read,fwrite/write等也会发生同样的情况.

这里有一个很好的描述unix系统调用执行的任务.


Hou*_*eng 6

实际上,系统调用与函数调用无关.这两种机制中唯一常见的是它们都为呼叫者提供服务.

  • 从线程执行的角度来看系统调用:

    系统调用是应用程序模式程序的功能,用于请求由下划线OS提供的服务.系统调用将运行线程从用户模式带入内核模式,执行系统调用处理函数,然后返回用户模式.

  • 系统调用参数:

    系统调用的参数是(系统调用号,参数...).params的含义和格式取决于系统调用号.

  • 从提供给用户程序的syscall库的视图:

    用户模式程序通常调用glibc的库来调用系统调用.例如,glibc中的open()函数:

    1. 将系统调用号SYS_OPEN放入eax寄存器
    2. 通过调用软件中断或sys_enter指令请求系统调用


Mar*_*ins 1

fopen是一个函数调用,但有时也称为系统调用,因为它最终由“系统”(操作系统)处理。 fopen内置于C 运行时库中。