2010-08-19 5 views
3

우리는 기존 Windows 코드를 Linux로 이식하고 있습니다. 우리는 ACE를 추상 레이어로 사용하고 있습니다. 우리는 여러 클라이언트와 통신하고 중복 된 작업을 수행하기 위해 파이프라는 창을 사용하고 있습니다.Linux의 Windows NAmed Pipe 대체품

linux에서 이와 동일한 기능은 무엇입니까? 나는 리눅스라는 이름의 파이프 (FIFO)를 검사했지만, 그들은 오직 하나의 클라이언트와 서버만을 지원하는 것처럼 보이고 오버랩 IO를 지원하지 않는다.

이 문제와 관련하여 저를 안내해 줄 수 있습니까?

답변

4

유닉스 소켓. 기본적으로

  1. socket(PF_UNIX, SOCK_STREAM, 0)으로 전화하십시오. 이것은 파일 기술자를 반환하거나 에러시 -1을 반환합니다.
  2. struct sockaddr_un addr; bzero(addr); addr.sun_len = sizeof(addr); addr.sun_family = PF_UNIX; strncpy(addr.sun_path, "/path/to/file", sizeof(addr.sun_path)-1);과 같은 것을 사용하여 소켓 주소를 만듭니다.
  3. bind(fd, &addr, sizeof(addr))으로 전화하십시오.
  4. 연결을 수신 대기하려면 listen(fd,backlog)으로 전화하십시오. backlog은 존재할 수있는 accept() 연결의 수입니다.
  5. accept()를 사용하여 클라이언트의 연결을 수락합니다. 새로운 FD 또는 -1 오류가 반환됩니다.
  6. 클라이언트가 비슷한 소켓을 만들고 주소에 connect()를 수행하게하십시오 (바인딩하지 않아도됩니다).
  7. 완료되면 파일/path/to/file을 제거하십시오 (나중에 다시 사용하려면 그대로 두십시오).

유닉스 소켓에서 SOCK_DGRAM이 지원되는지 확실치 않습니다. 그렇다면 아마 UDP와 유사 할 것입니다.

socket (2), bind (2), listen (2), accept (2), connect (2), unix (4), setsockopt (2)의 매뉴얼 페이지를 참조하십시오.

"겹친 I/O"의 경우 select (2)를 참조하십시오. fcntl(fd,F_SETFL,(int)(fcntl(fd,F_GETFL)|O_NONBLOCK))으로 non-blocking IO를 추가로 활성화 할 수 있습니다 (fcntl (2) 참조). 이는 read() 및 write()가 결코 차단되지 않음을 의미합니다 (write()가 반환 할 수 있으므로 반환 값을 살펴 봐야 함).

Windows 명명 된 파이프가 여러 클라이언트의 다중 연결을 나타내는 방식은 잘 모르겠지만 UNIX에서는 연결 당 하나의 파일 설명자 ("수신 대기"소켓의 경우 하나)를 얻습니다.

0

내가 기억한다면 fork()와 stdin/stdout 및/또는 소켓을 수행한다고 생각합니다. 나는 Python으로 해왔지만, IPC wrapper가 아주 훌륭하기 때문에 * nix에서 정확히 어떻게 동작하는지 모르겠습니다.

필자가 확신하는 것은 Windows에 존재하는 것과 같이 중복 I/O와 같은 것이 없다는 것입니다. 잠금 기본 요소는 Windows와 비교해도 흡족합니다. 소켓의 내용이 더 잘 작동하는 경향이 있습니다.

따라서 fork()과 그 주변의 IPC 관련 항목을 살펴보십시오. 좋은 reference에 투자하고 싶을 수도 있습니다. 이 책은 Windows의 Hart tome와 같습니다.

0

통신이 로컬 인 경우 유닉스 도메인 소켓 또는 TCP 소켓을 사용하십시오. Unix 도메인 소켓은 호출 프로세스의 자격 증명을 수신 할 수 있습니다.

네트워크에있는 경우 TCP 소켓을 사용하십시오.

Windows 명명 된 파이프의 일부 기능은 지원되지 않으므로 TCP 소켓을 통해 자격 증명을 전달할 수 없으므로 프로토콜을 필요로하지 않도록 프로토콜을 수정해야합니다.