32

次のような簡単なコードがあります。

sockaddr_un address;
address.sun_family = AF_UNIX;
strcpy(address.sun_path, path);
unlink(path);

int fd = socket(AF_UNIX, SOCK_STREAM, 0);
bind(fd, (sockaddr*)(&address), sizeof(address));
listen(fd, 100);

特定のアクセス許可を持つ Unix Domain Socket ファイルをアトミックに作成したいと考えています0777。マニュアルには、ソケットファイルのアクセス許可については何も書かれていませんumask。ソケットファイルに影響を与える場合でも、それumaskはアトミックな方法ではありません-マルチスレッドプログラムでは。

呼び出しの同期を使用せずに目標を達成する方法があることを願っていumask()ます。

4

3 に答える 3

22

別の解決策は、必要なアクセス許可を持つディレクトリを作成し、その中にソケットを作成することです (エラー チェックとバッファ オーバーフローを考慮しないコード例)。

// Create a directory with the proper permissions
mkdir(path, 0700);
// Append the name of the socket
strcat(path, "/socket_name");

// Create the socket normally
sockaddr_un address;
address.sun_family = AF_UNIX;
strcpy(address.sun_path, path);
int fd = socket(AF_UNIX, SOCK_STREAM, 0);
bind(fd, (sockaddr*)(&address), sizeof(address));
listen(fd, 100);
于 2014-02-05T03:22:28.740 に答える