2011-01-17 7 views
10

해당 컴퓨터에서 실행중인 다른 인스턴스를 인식하고 통신해야하는 프로그램을 작성해야합니다. 나는 리눅스에서 그것을 수행하는 정식 방법이 있는지 알고 싶다.프로세스가 동일한 프로그램의 다른 프로세스를 인식하도록 만드는 방법

저의 첫 번째 생각은 프로세스의 PID를 포함하는 파일을 작성하고 프로그램이 실행될 때마다 해당 파일을 찾는 것이지만 그 파일의 "올바른"장소와 이름은 어디에 있습니까? 더 나은, 또는 "올바른"방법이 있습니까?

그런 다음 사용자가 실행하려고했으나 다른 인스턴스가 있으므로 작업을 넘겨 종료합니다. SIGUSR1처럼 신호를 보내는 것만으로 생각했지만 사용자가 두 번째 프로세스를 실행 한 X11 디스플레이와 같은 더 많은 정보를 보낼 수는 없습니다. 이 정보를 보내는 방법?

프로그램이 Gtk와 연결되어있어 glib를 사용하는 솔루션이 괜찮습니다.

답변

10

pid를 파일에 넣는 것이 일반적인 방법입니다. 데몬 ("시스템 프로그램")의 경우, 그러한 파일을 저장하는 일반적인 장소는 /var/run/PROGRAM.pid입니다. 사용자 프로그램의 경우, 사용자의 homedir에 숨겨진 pid 파일을 두십시오 (프로그램에 구성 파일이있는 경우, config 파일과 pid 파일을 집 디렉토리 하위 디렉토리에 넣으십시오).

"마스터"인스턴스로 정보를 보내는 것이 가장 일반적으로 로컬 소켓이라고도하는 Unix 도메인 소켓을 사용하여 이루어집니다. 소켓을 사용하면 pid 파일이 필요하지 않습니다 (아무도 소켓에서 청취하지 않으면 프로세스는 마스터를 인식합니다).

+3

pid 파일만으로는 거의 쓸모가 없습니다. 응용 프로그램이 충돌하면 pid 파일을 삭제할 수 없으므로 수동으로 삭제해야합니다. 더 나은 옵션은 프로세스가 어떻게 든 끝날 때 OS가 항상 잠금을 해제하기 때문에 pid 파일을 잠그는 것입니다. 'ls -la'를 실행하면 잠금을 볼 수 없습니다. 유닉스 도메인 소켓 하나면 충분하다. –

+0

@Maxim : False. 'unlink (...)'는 파일이 닫힌 후에 파일을 삭제합니다. 그래서'fd = open (path, ...); unlink (path);'는 임시 파일을 갖는 일반적인 트릭입니다. – Alexandru

+0

@Alexandru : 거의 맞습니다. 임시 파일이 아니라 pid 파일에 대해 논의하고 있다는 사실을 놓쳤습니다. 응용 프로그램이 종료되기 전에 pid 파일을 제거하면 안됩니다. –

9

유닉스 도메인 소켓. 첫 번째 인스턴스를 임시 디렉토리에 만들고 첫 번째 인스턴스를 통해 다른 인스턴스와 통신하십시오.

+2

임시 디렉토리가 아닐 가능성이 있습니다 -/var/run은 소켓 파일에서 매우 일반적입니다. –

5

일반적인 방법은 PID 파일을 작성하는 것입니다. pidfile(3) 라이브러리를 확인하십시오.

1

이렇게하는 방법은 여러 가지가 있습니다. 제안한 방식 (PID가 포함 된 파일 사용)은 유효한 응용 프로그램이며 많은 응용 프로그램에서 사용됩니다.

때때로 응용 프로그램의 구성 파일에 PID 파일의 경로가 포함되고 하드 코드 된 경로가 사용되는 경우가 있습니다. 일반적으로 응용 프로그램은 /tmp/var (또는 uid가 0 인 경우) 또는 로컬 디렉토리 (~/.application/)에 PID 파일을 넣습니다.

PID 파일을 넣을 위치에 대한 일반적인 제안이 없으므로 원하는 장소를 선택하십시오.

2

리눅스에는 이름이 지정된 뮤텍스 또는 세마포어가 있습니까? 따라서 '잠겨있는지'를 확인한 다음 이미 사용자에게 경고하고 종료한다고 사용자에게 경고 할 수 있습니다.

이 링크에서 의미가 있습니까? http://www.linuxquestions.org/questions/programming-9/named-mutex-in-linux-296816/

+0

명명 된 세마포어는 여러 인스턴스의 문제를 해결하는 방법으로 작동하는 것처럼 보입니다. 그러나 다소 정통성이 없습니다. – lvella

+2

이 방법이 효과적 일 수는 있지만, 네임 스페이스가 시스템의 모든 프로세스에서 공유된다는 점에서 오히려 추한 것입니다. 그리고 다른 사용자는 동일한 이름의 명명 된 세마포어를 열어 프로그램을 수행 할 수 있습니다. 개인적으로 나는 무작위 화 된 이름없이 POSIX라는 이름의 세마포어/공유 메모리를 결코 사용하지 않을 것이며 올바른 권한을 가진 프로세스를 제외하고 쓰기가 불가능한 다른 안전한 채널을 통해 이름을 전달할 것입니다. –

1

확실히 유닉스 도메인 소켓을 사용할 수 있습니다. DCOP 나 DBUS와 같은 상위 시스템을 사용하지 않는 대부분의 응용 프로그램에서 이러한 응용 프로그램을 사용한다고 생각합니다.

"Linux 네임"인 경우 "유닉스 네임 스페이스"유닉스 소켓을 사용할 수 있습니다. 이것들은 파일 시스템에 존재할 필요가 없기 때문에 꽤 좋다.

프로그램이 사용자 지향적 인 경우 다중 사용자를 인식해야합니다. 한 사용자는 다른 사용자의 앱 사본에서 행동을 유발해서는 안되며 사용자가 서로 쉽게 DoS 할 수 없도록 보안을 유지해야합니다 (예 : 사용자 A의 프로그램 사본이 중단되면 사용자를 중지시킵니다. B가 시작되는 것?).

+0

사용자의 집 안에 파일을 보관하면 다른 사용자와의 간섭을 막을 수 있다고 생각합니다. – lvella

+0

그게 가능한 구현의 한 가지예요. – MarkR

관련 문제