7

我的老师让我写一个不执行任何系统调用的 C 函数。函数什么都不做并不重要。

以下函数是否执行任何系统调用?

int func() {
  return 0;
}

如果是这样,你能给我一个像我正在寻找的样例函数吗?

非常感谢。

4

3 回答 3

6

即使代码本身不包含系统调用(可以满足要求),也有一些隐含的系统调用来实际初始化、运行、停止和清理进程,即使它们不是二进制文件的一部分。执行哪些系统调用取决于平台。此外,至少退出状态将根据您关闭进程的方式设置:return statement vs exit() in main()

我想,你的老师会对那个代码感到满意,它不使用标准库,它本身包含许多用于不同目的的系统调用(就像大多数其他库一样)。您将无法从/向标准输入/输出和文件/套接字等读取/写入。因此您不能执行 IO、进程创建和多线程、同步等,因为所有这些都需要系统调用(例如用户线程和自旋锁可能是一个明显的例外)。没有系统调用就无法编写有用的用户态程序,除非程序采用一些参数,结果返回为int(例如命令行工具)。您还可以实现“完全安静”的 CPU 加热功能。

于 2013-06-14T17:17:25.397 回答
2

不,您的示例函数不会进行任何系统调用。你可以编译和反汇编它来确定:

$ cc -O3 -c example.c 
$ objdump -d example.o 

example.o:     file format elf64-x86-64


Disassembly of section .text:

0000000000000000 <func>:
   0:   31 c0                   xor    %eax,%eax
   2:   c3                      retq   

或者没有优化,如果这很重要:

$ cc -c example.c 
$ objdump -d example.o 

example.o:     file format elf64-x86-64


Disassembly of section .text:

0000000000000000 <func>:
   0:   55                      push   %rbp
   1:   48 89 e5                mov    %rsp,%rbp
   4:   b8 00 00 00 00          mov    $0x0,%eax
   9:   5d                      pop    %rbp
   a:   c3                      retq   
于 2013-06-14T17:07:09.133 回答
1

是的,上面有系统调用。每次有系统调用时可以使用 ptrace() 停止,你会看到有系统调用。如果没有操作系统,程序将如何从内存中加载和卸载?

于 2013-06-14T17:04:06.737 回答