2014-11-03 2 views
5

D에서 주로 IPC라는 이름의 IPC에 사용할 수있는 방법을 알아 내려고합니다. 나는 std.process가 관련 프로세스에서 이름이없는 파이프에 대한 함수를 포함하고 있음을 알고 있지만 양방향 인 관련없는 프로세스와 함께 ipc를 더보고있다. 로컬 소켓을 사용하거나 공유 메모리를 조사해야 할 필요가 있다고 생각했습니다.D에 명명 된 파이프를 생성 하시겠습니까?

이 작업을 수행 할 수있는 예제가 있습니까?

+0

에 사람들은 OS가 그래서 당신이 IPC의 질문에 대한 대답은 매우 간단합니다 그들에게 –

+1

를 만들기 위해 C-API를 사용해야 할 것이라고 예상 고유와 동일하게 이루어집니다 - 시스템에서 사용 가능한 모든 IPC를 가질 수 있습니다. D 응용 프로그램은 모든 C 라이브러리 함수를 호출 할 수 있습니다. 더욱이, 정말로 원한다면 시스템 호출을 D에서 직접 할 수 있습니다. – DejanLekic

답변

6

유닉스에서는 TCP 소켓과 비슷하지만 로컬에서만 std.socket을 사용하여 유닉스 도메인 소켓을 만들 수 있습니다.

// SERVER 
import std.socket; 
void main() { 
    auto listener = new Socket(AddressFamily.UNIX, SocketType.STREAM); 
    listener.bind(new UnixAddress("/home/me/uds")); 
    listener.listen(10); 

    /*while(1)*/ { 
     auto soc = listener.accept(); 
     soc.send("cool\n"); 
     soc.close(); 
    } 

    listener.close(); 

    import core.sys.posix.unistd; 
    unlink("/home/me/uds"); 
} 

그리고 클라이언트 : 여기에 몇 가지 예제 코드입니다

void main() { 
    auto soc = new Socket(AddressFamily.UNIX, SocketType.STREAM); 
    soc.connect(new UnixAddress("/home/me/uds")); 

    import std.stdio; 
    char[1222] buf; 
    writeln(buf[0 .. soc.receive(buf)]); 
    soc.close(); 
} 

서로에 대해 알고있는 유일한 것은 메시지 (물론)을 의미하고, 소켓에 파일 시스템 경로 무엇인가 .

유닉스는 또한 명명 된 파이프를 않지만, 그들은 당신이 유닉스 명명 된 파이프를 원하는 경우에, 그들은 FIFO 파일이라고하고 함께 만들어

유닉스 도메인 소켓 (또는 Windows 명명 된 파이프)처럼 양방향 일하지 않습니다 mkfifo 시스템 API 함수 import core.sys.posix.sys.stat;을 사용하여 액세스 할 수 있으며 C와 같은 방식으로 사용합니다. 문자열과 모드를 전달하여 파일을 만들고, 반환 값을 확인한 다음, Unix 파일 함수를 사용하여 읽기/쓰기하는 것을 잊지 마십시오. read, write, close, 모두 import core.sys.posix.unistd;. 이러한 함수에 대해서는 C 설명서를 참조하십시오. man 2 read 또는 man 3 mkfifo 인 경우 Linux를 사용하거나 웹에서 해당 페이지를 검색하십시오.

하지만 유닉스 도메인 소켓은 당신이 찾고있는 것인데 위의 예제에서 볼 수 있듯이 다른 소켓과 기본적으로 동일하게 작동한다고 생각합니다.

Windows는 일을 다르게하고 D 표준 라이브러리에는 OS API 함수 프로토 타입이 포함되지 않습니다.

http://msdn.microsoft.com/en-us/library/windows/desktop/aa365150%28v=vs.85%29.aspx

당신은 (그러나 통합 파일 시스템에서, 유닉스 도메인 소켓과 유사) 그것을 다른 프로세스가 사용할 수있는 경로 이름을주고, 그 기능을 명명 된 파이프를 만듭니다. 그런 다음 CreateFile 함수를 사용하여 파이프를 열고 다른 파일과 마찬가지로 말할 수 있습니다.

당신이 D. 하나에서이 함수를 호출 할 수 있도록 함수 프로토 타입을 얻을 수있는 두 가지 방법은 다음과 같이,/그들에게 자신을 붙여 복사 할 수 있습니다입니다 :

import core.sys.windows.windows; 기본적인 윈도우 유형 정의를 얻을,
extern(Windows) 
    HANDLE CreateNamedPipeA(
      LPCTSTR lpName, 
      DWORD dwOpenMode, 
      DWORD dwPipeMode, 
      DWORD nMaxInstances, 
      DWORD nOutBufferSize, 
      DWORD nInBufferSize, 
      DWORD nDefaultTimeOut, 
      LPSECURITY_ATTRIBUTES lpSecurityAttributes 
    ); 

첫째, 그런 다음 파일에 그와 같은 문장을 추가하십시오. 에서과 같은 것들과 함께 MSDN과 동일합니다. (당신은 prolly 단지 그들을 D의 in 키워드로 바꿀 수도 있습니다).

큰 것은 이름에 A 또는 W가 추가 된 것입니다. 이것은 유니 코드 대 ANSI 이름에 관한 마이크로 소프트 문서의 하단에 언급되어 있습니다. A 버전은 ASCII 문자열을 사용합니다. W 버전은 D에서 utf-16, wstring을 사용합니다. W 버전이 권장되지만 일부 버전에서는 A 버전이 약간 더 사용하기 쉽습니다.

또는 미리 만들어진 win32 바인딩을 https://github.com/AndrejMitrovic/DWinProgramming/tree/master/WindowsAPI에서 다운로드하여 빌드 할 때 사용할 수 있습니다.

몇 가지 기능이 필요한 경우 종속성을 피하기 위해 복사/붙여 넣기를 선호하지만 많은 Windows API 작업을 수행하는 경우 전체 바인딩을 다운로드하십시오. https://github.com/adamdruppe/terminal-emulator/blob/master/detachable.d

부착 가능한 부분이 UDS 클라이언트 입니다 : https://github.com/adamdruppe/terminal-emulator

분리 가능한 부분은 유닉스 도메인 소켓 서버를 사용

나는 이러한 기술을 사용한다 D의 크로스 플랫폼 터미널 에뮬레이터를 썼다 https://github.com/adamdruppe/terminal-emulator/blob/master/attach.d

Windows 에뮬레이터 코어는 특별한 명명 된 파이프를 사용하여 사용 사례가 아닌 자신의 비동기 '익명'파이프를 사용하지만 함수 호출 방법을 보여줍니다. https://github.com/adamdruppe/terminal-emulator/blob/master/terminalemulator.d

공유 메모리는 할 수있는 일이지만 D 라이브러리의 도움이 거의 필요하지 않으므로 OS 기능을 사용해야합니다. 하지만 적어도 어렵지는 않습니다. 적어도 유닉스에는 함수의 프로토 타입이 있습니다 : import core.sys.posix.sys.shm 그리고 C와 같은 함수를 사용하십시오.

하지만 빠른 검색에 따르면 메모리 매핑 된 파일을 만들 수 있습니다. http://msdn.microsoft.com/en-us/library/windows/desktop/aa366551%28v=vs.85%29.aspx

아마 어쩌면 아마 phobos : http://dlang.org/phobos/std_mmfile.html에서 도움을 얻을 수 있지만 다시는 실제로 시도한 적이 없습니다. 공유 메모리가 필요할 때, 나는 shmget 등의 유닉스 기능을 수행했다. (이것은 내 simpledisplay.d에있다. X 서버와 통신하는데 사용하는 https://github.com/adamdruppe/arsd/blob/master/simpledisplay.d).

하지만 유닉스 도메인 소켓은 기본적으로 TCP 소켓과 동일하며 Phobos의 std.socket이 도움이됩니다. 다른

모든는 것 C.

+0

위와 같이 여러분이 올린 코드 예제와 함께 여러분의 대답은 매우 통찰력이 있습니다. 나는 TDPL뿐만 아니라 당신의 책을 구입할 계획을 가지고 있습니다. 얼마나 강력하고 단순한 D가 얼마나 강한 지 내 마음이 날아갑니다. 그것은 나를위한 완벽한 언어입니다. 당신의 도움을 주셔서 감사합니다. – user1632018

+0

방금 ​​도서를 구입했습니다. 또한 서둘러 배송을 주문했습니다. 오늘 받아야 겠어. : D – user1632018

+0

차갑다. 41 페이지의 유닉스 소켓에 대해 간략하게 이야기했고 select()를 사용하여 소켓 서버를 수행하여 여러 클라이언트를 처리하는 방법과 버퍼링이 어떻게 작동하는지에 대한 예가 있습니다 (이 모두는 dlang.org 웹 사이트 설명서에서도 사용 가능합니다). 거기에 실례가 없다). 4 장에서는 C 및 Windows 함수 사용에 대해 자세히 설명합니다. (사실, 많은 책의 주제는 이전에 SO 또는 D 포럼에 응답 한 질문을 기반으로합니다!) –

관련 문제