如何在C中创build具有特定权限的Unix域套接字?

我有一个简单的代码,如:

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); 

我想自动创build具有特定权限的Unix域套接字文件,如: 0777 。 手册没有提到有关umask或其他方面的socket文件权限的问题。 即使umask确实会影响套接字文件,那么它也不是primefaces的方式 – 在multithreading程序中。

我希望,有一种方法可以实现我的目标,而不使用umask()调用的同步。

另一个解决方案是创建一个具有所需权限的目录,然后在其中创建套接字(示例代码,不考虑错误检查和缓冲区溢出):

 // 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); 

在调用socket(),bind()之后,在调用listen()之前,我使用chmod()(不是fchmod)使用unix域套接字的文件名。

  int return_value; const char *sock_path; struct sockaddr_un local; sock_path = "/tmp/mysocket"; sockfd = socket(AF_UNIX, SOCK_STREAM, 0); if (sockfd == -1) { perror("socket"); exit(-1); } local.sun_family = AF_UNIX; strcpy(local.sun_path, sock_path); unlink(local.sun_path); len = strlen(local.sun_path) + sizeof(local.sun_family); bind(sockfd, (struct sockaddr *)&local, len); chmod(sock_path, 0777); retval = listen(sockfd, BACKLOG); if (retval == -1) { perror("listen"); exit(-1); } 

。 。 。 。 。

分叉,使用umask并传回fd是我能想到的唯一便携式方式。 在任何情况下,有一个套接字的目录是更好的,例如,如果目录不适当的权限,没有人可以删除套接字,创建diretcories可以自动完成。

更大的问题是,依赖权限是不可移植的 – 许多BSD派生的套接字栈只是忽略了包含目录和/或套接字本身的权限。

在GNU / Linux系统上,你可以通过在socket()之后和bind()之前的套接字fd上调用fchmod来完成。