老师让我写一个不执行任何系统调用的C函数。函数不完成任何任务都没关系。
下面的函数是否执行任何系统调用?
int func() {
return 0;
}
如果有,你能给我一个我正在寻找的示例函数吗?
即使代码本身不包含系统调用(什么可以满足要求),也有一些隐含的系统调用来实际初始化、运行、停止和清理进程,即使它们不是二进制文件的一部分。执行哪个系统调用取决于平台。此外,至少退出状态将根据您关闭进程的方式设置:main()
中的return语句与exit()我猜,你的老师会对这段代码很满意,它没有使用标准库,标准库本身包含许多不同目的的系统调用(就像大多数其他库一样)。你将无法读写stdin/out和文件/套接字等。所以你不能做IO,进程创建;多线程、同步等,因为所有这些都需要系统调用(像用户线程和自旋锁这样的东西可能是一个值得注意的例外)。如果没有系统调用,就无法编写有用的用户域程序,除非程序接受一些参数,并以int
返回结果(例如命令行工具)。你也可以实现"完全安静"的CPU加热的东西。
不,您的示例函数不进行任何系统调用。您可以编译并反汇编它以确保:
$ 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
上面有系统调用。您可以使用ptrace()在每次有系统调用时停止,您将看到有系统调用。如果没有操作系统,该如何从内存中加载和卸载程序呢?