如何判断函数是否使用系统调用

时间:2015-05-07 18:54:46

标签: c++ operating-system system-calls cin

我正在学习系统调用,并开始理解它们。我知道你不应该直接调用它们(因为它会使你的代码不那么便携)而且你应该调用API代替它们。但是,有没有办法判断某个函数是否使用系统调用?我读到并非所有函数都需要系统调用(某些库函数)。例如,fopen最终将使用系统调用。我的问题是:

  1. 像cin(c ++)这样的函数是否需要系统调用

  2. 有没有办法判断函数是否使用系统调用?

1 个答案:

答案 0 :(得分:3)

GDB有一个“中断系统调用”功能。见https://sourceware.org/gdb/onlinedocs/gdb/Set-Catchpoints.html

因此,如果您不熟悉调试工具,那么策略就是设置catchpoint并跨越调用函数的行(gdb中的“next”)。如果它在函数调用后到达行之前中断,则发生系统调用(或者程序崩溃,我猜)。

使用cin >> ...读取输入时,可能会调用也可能不会调用系统调用。这取决于缓冲区中是否已有足够的数据。如果缓冲区中没有足够的数据,则必须进行系统调用以从基础文件或设备中检索数据。

C ++语言没有提供一种简单的内置方法来静态地确定某个函数是否可以执行系统调用。实际上,函数foo可能会调用一些extern函数bar,它将被单独编译(在另一个翻译单元中),它会调用系统调用; foo可能间接调用系统调用的事实直到链接时才能知道。