システムコール accept4() が無効な値を返します。

システムコール accept4() が無効な値を返します。

私はシステムコールを記録できる「strace」に似たプログラムを作成しました。
また、Webサーバーをインストールし、「strace」と私のプログラムのシステムコールを観察して比較しました。
各プログラムについて、Web サーバーに単純な HTTP GET 要求を送信して複数のシステムコールを生成します。

私のプログラムでは:

私は特定のaccept4()実行で戻り値が(-11)であることがわかりました。これは(マイナス11)を意味します!
ただし、 accept4() の (-11) 戻り値は絶対に発生しないでください。
accept4()システムコールが終了したときにRAXレジスタに(-11)が表示される理由がわかりません。

添付ログ私のプログラム。
2つのaccept4()システムコールがあります(システムコール番号288):

  • 行14:最初のaccept4()システムコール、エントリ。
  • 行18:最初のaccept4()システムコールを実行して終了します。
  • 行86:2番目のaccept4()システムコール、エントリポイントです。
  • 90行目:2番目のaccept4()システムコール、終了。

"strace"プログラムから:

疑わしいaccept4()は(-1)を返し、「strace」フラグはEAGAINです。
しかし、 'errno'プロシージャによると、次のようになります。

~$ errno 1
EPERM 1 Operation not permitted
~$ errno 11
EAGAIN 11 Resource temporarily unavailable

添付ログ"strace"プログラムの
2つのaccept4()システムコールがあります(システムコール番号288):

  • 行4:最初のAccept4()システムコール。
  • 行15:2番目のaccept4()システムコール。

私の質問は次のとおりです

  1. straceが私のプログラムとは異なる戻り値を報告するのはなぜですか?
  2. 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)戻り値とエラーを返す方法にアーキテクチャごとに違いがあります。)

ユーザー空間のインターフェースに応じて値を表示するのは単にユーザビリティの選択かもしれませんが、わかりません。

関連情報