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
呼び出し元が指定した資格情報(特権を持っている必要がありました)であり、必ずしもピアの資格情報である必要はありません。