>백엔드 개발 >Golang >Windows에서 Go 실행 파일의 인스턴스가 하나만 실행되도록 하려면 어떻게 해야 합니까?

Windows에서 Go 실행 파일의 인스턴스가 하나만 실행되도록 하려면 어떻게 해야 합니까?

Barbara Streisand
Barbara Streisand원래의
2024-11-27 09:24:15413검색

How Can I Ensure Only One Instance of a Go Executable Runs on Windows?

Windows용 Go에서 실행 파일의 단일 인스턴스로 제한

동일한 프로그램의 여러 인스턴스를 방지하려면 한 번에 실행 파일의 단일 인스턴스만 실행되도록 하는 것이 중요합니다. 시스템 리소스를 소비하거나 충돌을 일으키지 않습니다. 이 기사에서는 글로벌 뮤텍스를 사용하여 Windows 시스템용 Golang에서 단일 인스턴스 실행을 달성하는 방법을 살펴봅니다.

단일 인스턴스 제어를 위한 글로벌 뮤텍스

글로벌 뮤텍스는 여러 프로세스를 허용하는 동기화 프리미티브입니다. 또는 동시 액세스를 방지하여 공유 리소스에 대한 액세스를 공유하는 스레드입니다. 이 경우 모든 사용자 세션에서 "SomeMutexName"이라는 전역 뮤텍스를 사용하면 실행 파일의 단일 인스턴스만 실행할 수 있습니다.

코드 구현

import (
    "syscall"
    "unsafe"
)

var (
    kernel32        = syscall.NewLazyDLL("kernel32.dll")
    procCreateMutex = kernel32.NewProc("CreateMutexW")
)

func CreateMutex(name string) (uintptr, error) {
    ret, _, err := procCreateMutex.Call(
        0,
        0,
        uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(name))),
    )
    switch int(err.(syscall.Errno)) {
    case 0:
        return ret, nil
    default:
        return ret, err
    }
}

func main() {
    _, err := CreateMutex("Global\SomeMutexName")
    if err != nil {
        return
    }
}

솔루션 아키텍처

이 코드는 syscall 패키지를 사용하여 "kernel32.dll" 라이브러리에서 Windows API 함수 "CreateMutexW"를 초기화합니다. 그런 다음 전역 뮤텍스 이름으로 이 함수를 호출하여 명명된 뮤텍스를 만듭니다. 함수가 오류 없이 반환되면 실행 중인 실행 파일의 다른 인스턴스가 없음을 나타냅니다. 그렇지 않으면 다른 인스턴스가 이미 실행 중이라는 의미입니다.

다른 플랫폼으로의 이식성

제공된 코드는 Windows 시스템의 이 특정 문제를 해결하지만 Global Mutex 기술은 이식성이 없다는 점에 주목할 가치가 있습니다. 모든 플랫폼에서. 각 플랫폼에는 인스턴스 잠금을 구현하기 위한 자체 메커니즘이 있습니다. 예를 들어 Unix 계열 시스템에서는 "lockfile" 접근 방식이나 "F_SETLK"가 포함된 "fcntl" 기능을 사용하여 유사한 기능을 구현할 수 있습니다.

위 내용은 Windows에서 Go 실행 파일의 인스턴스가 하나만 실행되도록 하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.