我创建了一个类似于“strace”的程序,它能够记录系统调用。
我还安装了一个网络服务器,并从“strace”和我的程序中观看系统调用,并对它们进行比较。
对于每个程序,我向网络服务器发起一个简单的 HTTP GET 请求,该请求创建了多个系统调用。
在我的程序中:
我注意到在某个accept4()执行中,返回值为(-11),意思是(负11)!
但是accept4()的(-11)返回值永远不应该发生。
我不明白为什么当accept4()系统调用退出时我在寄存器RAX中得到(-11)。
附上日志我的程序。
有两个accept4()系统调用(系统调用号288):
- 第14行:第一个accept4()系统调用,条目。
- 第 18 行:首先accept4() 系统调用,退出。
- 第 86 行:第二个 accept4() 系统调用,入口。
- 第90行:第二个accept4()系统调用,退出。
在“strace”程序中:
可疑的accept4()返回(-1),“strace”标识为EAGAIN。
但根据 'errno' 程序,则:
~$ errno 1
EPERM 1 Operation not permitted
~$ errno 11
EAGAIN 11 Resource temporarily unavailable
附上日志“strace”程序的。
有两个accept4()系统调用(系统调用号288):
- 第 4 行:第一个 Accept4() 系统调用。
- 第15行:第二个accept4()系统调用。
我的问题是:
- 为什么 strace 报告的返回值与我的程序不同?
- 我应该如何正确解释第二个accept4()系统调用返回的(-11)?
附加技术数据:
使用带有标志“-g -Wall”和链接器标志“-lm”的 gcc 编译器。
“gcc -v”的重要数据是:
Target: x86_64-linux-gnu
gcc version 11.3.0 (Ubuntu 11.3.0-1ubuntu1~22.04)
包含“cpp -v”中的路径:
/usr/lib/gcc/x86_64-linux-gnu/11/include
/usr/local/include
/usr/include/x86_64-linux-gnu
/usr/include
答案1
strace
似乎显示所有错误返回为 -1 以及错误代码:
$ strace ls /enoent
...
stat("/enoent", 0x55c15dfbb150) = -1 ENOENT (No such file or directory)
这就是系统调用包装函数返回的内容,因此即使内核只返回一个值,这也不是完全错误的。 (尽管查看手册页中的表格syscall(2)
,不同体系结构在如何从内核返回返回值和错误方面存在差异。)
根据用户空间界面显示值可能只是一种可用性选择,但我不知道。