0

まず、はい、これはこのスタック オーバーフローの質問に関連していますが、状況が少し異なり、投稿に回答がありません。

そこで、Dell デスクトップ ワークステーション Ubuntu 10.04 32 ビットで、Apache が実行する PHP「プログラム」に Unix ドメイン ソケットを提供するように設計されたサーバー プログラムを開発しました。(注: umask = 0022) ソケット ファイルに /home/wmiller/ACT/web_socket_file という名前を付けました。(ACTは製品名への参照です)。/home/wmiller/ACT には 777 のアクセス許可があります。/home/wmiller/ACT/web_socket_file は 777 のアクセス許可で作成されます。

ここで、このプログラムをテスト プラットフォーム (Q7 フォーマットの Intel プロセッサ ボード) にコピーします。これには、Ubuntu 10.04 32 ビットと umask = 0022 も含まれています。同じディレクトリ、ディレクトリに対する同じ 777 パーミッション。ただし、コード /home/wmiller/ACT/web_socket_file を実行すると、755 のアクセス許可が表示され、rw または rwx ではなく rx アクセス許可を取得するため、Apache/PHP は Unix ドメイン ソケットを開くことができません。Apache は uid = www-data で実行されています。

sockaddr_un       webServAddr;
remove( g_webSocketFileName.c_str() );       // to erase any lingering file from last time

memset(&webServAddr, 0, sizeof(webServAddr));
webServAddr.sun_family        = AF_UNIX;
snprintf( webServAddr.sun_path, UNIX_PATH_MAX, "%s", g_webSocketFileName.c_str() );

if (( g_webServerSock = socket(AF_UNIX, SOCK_STREAM, 0)) < 0 )
{
    PLOG( ERROR ) << "Failed to acquire the web Server socket: ";  // uses google glog tool
    return -1;
}

だから私はこれらの両方を試しましたが、どちらもうまくいきませんでした。

chmod( g_webSocketFileName.c_str(), S_IRWXU | S_IRWXG  | S_IRWXO );

char temp[100];
sprintf( temp , "chmod o+w %s\n", g_webSocketFileName.c_str() );
system( temp );

777 と o+w の権限を試しました。

私も追加しようとしました

unlink( g_webSocketFileName.c_str() );

しかし、そこには助けがありません。

ir があるマシンでは動作し、別のほぼ同一のマシンでは動作しない理由について、誰か提案がありますか? ソケットファイルを別の場所に置いた方がよいでしょうか? ソケットファイルが移動する標準的な場所はありますか?

4

1 に答える 1

4

Linuxでは、の前にfchmod()Unixドメインソケットファイル記述子を呼び出す必要があります。このようにして、呼び出しは指定された権限を持つファイルシステムオブジェクトを作成します。すでにバインドされているソケットを呼び出すことは効果的ではありません。 bind()bind()fchmod()

使用すると、 TOCTTOUchmod()の競合状態につながる可能性があります。可能であれば、代わりに使用してください。fchmod()

これはLinux固有のハックです。ほとんどのBSDシステムでfchmod()は、ソケットfdおよびsetで失敗しますEINVAL


編集。 私は、いじくり回すことによって、このシステム依存の動作の違いを見つけました。おそらく、これに最適な「ソース」は、カーネルのソースコード自体であるはずです。

  • FreeBSDではfchmod()、Unixドメインソケットは設定するno-opとして定義されているようですEINVAL (Ref1)
  • Linuxでは、Unixドメインソケットfdは、ファイルモードとともに(ただしS_IFSOCKビット単位で-または'ed in)、iノードのように作成されているように見えます。(参照2) Linuxのfchmod()実装は、そのようなオブジェクトに変更を喜んで適用します。Unixドメインソケットをアドレスにバインドする場合、ファイルシステムオブジェクトの作成にファイルモードが使用されます。(Ref3) によるとman 2 statS_IFSOCKPOSIX.1-2001に存在します。

ソースを間違って読んだ場合は、遠慮なく訂正してください。

于 2013-03-16T14:52:20.510 に答える