私はシステムコールを記録できる「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()システムコール。
私の質問は次のとおりです
- 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)
戻り値とエラーを返す方法にアーキテクチャごとに違いがあります。)
ユーザー空間のインターフェースに応じて値を表示するのは単にユーザビリティの選択かもしれませんが、わかりません。