【问题标题】:How to tell if a function uses a system call如何判断一个函数是否使用系统调用
【发布时间】:2015-07-18 12:28:57
【问题描述】:
我正在学习系统调用并开始理解它们。我知道您不应该直接调用它们(因为它会降低您的代码的可移植性),而应该调用 API。但是,有没有办法判断某个函数是否使用系统调用?我读到并非所有函数都需要系统调用(一些库函数)。例如, fopen 最终将使用系统调用。我的问题是:
像cin(c++)这样的函数需要系统调用吗
有没有办法判断一个函数是否使用系统调用?
【问题讨论】:
标签:
c++
operating-system
system-calls
cin
【解决方案1】:
GDB 具有“中断系统调用”功能。见https://sourceware.org/gdb/onlinedocs/gdb/Set-Catchpoints.html
因此,如果您是调试工具的新手,那么策略是设置捕获点并跳过调用函数的行(gdb 中的“next”)。如果它在到达函数调用之后的行之前中断,那么就发生了系统调用(或者程序崩溃了,我猜)。
当您使用cin >> ... 读取输入时,可能会或可能不会调用系统调用。这取决于缓冲区中是否已经有足够的数据。如果缓冲区中没有足够的数据,则必须进行系统调用以从底层文件或设备中检索数据。
C++ 语言没有提供简单的内置方法来静态确定函数是否可以执行系统调用。事实上,函数foo 可能会调用一些extern 函数bar,这些函数将被单独编译(在另一个翻译单元中),它会调用系统调用; foo 可能间接调用系统调用的事实要到链接时间才能知道。