SO_PEERCREDは、接続されたAF_UNIXストリームソケットのpid / uid / gidを取得する簡単な方法です。SCM_CREDENTIALSはほぼ同じですが、より複雑です(さまざまな補助メッセージ)。両方の方法を示す例へのリンク。
- 多かれ少なかれ同じ情報を取得する2つの方法があるのはなぜですか?
- より快適なSO_PEERCREDがunix(7)のマンページにリストされていないのはなぜですか?
- 実際のアプリケーションでより多く使用されるのはどれですか?
何を使うべきですか?
SO_PEERCREDは、接続されたAF_UNIXストリームソケットのpid / uid / gidを取得する簡単な方法です。SCM_CREDENTIALSはほぼ同じですが、より複雑です(さまざまな補助メッセージ)。両方の方法を示す例へのリンク。
何を使うべきですか?
私が正しく理解していれば、2つの間に微妙な違いがあります。SO_PEERCREDピアプロセスからの対話を必要とせずに、ピアプロセスのクレデンシャルを取得します。対照的に、SCM_CREDENTIALSはピアプロセスのクレデンシャルを送受信するメカニズムであり、カーネルによってチェックされます。この微妙な違いは、プロセスがUID 0として実行されている場合に問題になる可能性があります。これSCM_CREDENTIALSにより、プロセスがUID 0として実行され、特権が低いと宣言できるようになります(たとえば、UID 50)SO_PEERCRED。
上記を参照。SCM_CREDENTIALS使用が推奨されておりSO_PEERCRED、互換性のためにのみサポートされていると思います。
dbusデーモンはとを使用SO_PEERCREDしているようgetpeereid()です。クレデンシャルを移植可能に取得するには、コードをコピーするのが最善だと思います。
SO_PEERCREDソケットピアのクレデンシャルを返します。SCM_CREDENTIALS特権を持つ資格情報を渡すことができます。カーネルがIDを変換するため、これは特に価値があります。そのため、あるpid名前空間のタスクは別の名前空間のプロセスにpidを送信でき、受信したpidが意図したのと同じプロセスを参照することが保証されます。
ピアのクレデンシャルが必要な場合は、を使用しますSO_PEERCRED。SCM_CREDENTIAL呼び出し元が指定した資格情報(特権を持っている必要がありました)であり、必ずしもピアの資格情報である必要はありません。