C에서 특정 권한으로 유닉스 도메인 소켓을 만드는 방법?
간단한 코드가 있어요 다음과 같습니다.
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
소켓 파일에 영향을 미치므로 다중 threaded 프로그램에서는 원자 방식이 아닙니다.
동기화를 사용하지 않고 목표를 달성할 수 있는 방법이 있기를 바랍니다.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);
나는 최고의 운을 이용했습니다.chmod()
(없음)fchmod()
호출 후 Unix 도메인 소켓의 파일 이름 사용socket()
,bind()
, 전화하기 전에listen()
.
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
내가 생각할 수 있는 유일한 휴대용 방법입니다.예를 들어, 소켓에 대한 디렉토리를 갖는 것이 더 낫습니다. 디렉토리에 적절한 권한이 없으면 아무도 소켓을 삭제할 수 없으며 디렉토리를 만드는 것은 원자적으로 수행될 수 있습니다.
더 큰 문제는 사용 권한에 의존하는 것이 휴대용이 아니라는 것입니다. 많은 BSD 파생 소켓 스택은 단순히 엔클로저 디렉토리 및/또는 소켓 자체의 사용 권한을 무시합니다.
GNU/리눅스 시스템에서는 다음을 호출하여 작업할 수 있습니다.fchmod()
소켓에fd
끝나고socket()
그리고 그전에bind()
.
언급URL : https://stackoverflow.com/questions/20171747/how-to-create-unix-domain-socket-with-a-specific-permissions-in-c
'IT' 카테고리의 다른 글
How do you Unit Test Python DataFrames (0) | 2023.10.30 |
---|---|
부트스트랩 4, 버튼을 중앙 정렬하려면 어떻게 해야 합니까? (0) | 2023.10.30 |
MySQL 인덱싱 및 파일 정렬 사용 (0) | 2023.10.25 |
다중 인덱스 DataFrame의 인덱스를 하나만 선택합니다. (0) | 2023.10.25 |
반응형 CSS 배경 이미지 (0) | 2023.10.25 |