系统调用accept4()返回无效值

系统调用accept4()返回无效值

我创建了一个类似于“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()系统调用。

我的问题是:

  1. 为什么 strace 报告的返回值与我的程序不同?
  2. 我应该如何正确解释第二个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),不同体系结构在如何从内核返回返回值和错误方面存在差异。)

根据用户空间界面显示值可能只是一种可用性选择,但我不知道。

相关内容