我的老师让我写一个不执行任何系统调用的 C 函数。函数什么都不做并不重要。
以下函数是否执行任何系统调用?
int func() {
return 0;
}
如果是这样,你能给我一个像我正在寻找的样例函数吗?
非常感谢。
我的老师让我写一个不执行任何系统调用的 C 函数。函数什么都不做并不重要。
以下函数是否执行任何系统调用?
int func() {
return 0;
}
如果是这样,你能给我一个像我正在寻找的样例函数吗?
非常感谢。
即使代码本身不包含系统调用(可以满足要求),也有一些隐含的系统调用来实际初始化、运行、停止和清理进程,即使它们不是二进制文件的一部分。执行哪些系统调用取决于平台。此外,至少退出状态将根据您关闭进程的方式设置:return statement vs exit() in main()
我想,你的老师会对那个代码感到满意,它不使用标准库,它本身包含许多用于不同目的的系统调用(就像大多数其他库一样)。您将无法从/向标准输入/输出和文件/套接字等读取/写入。因此您不能执行 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() 停止,你会看到有系统调用。如果没有操作系统,程序将如何从内存中加载和卸载?