2010-08-10 5 views
2

서버가 모든 클라이언트의 소켓에 공통 문자열을 써야하는 그룹 채팅 서버에 대한 사용 사례가있었습니다. 필자는 파일 디스크립터 목록을 반복하면서 각각의 파일 디스크립터에 문자열을 쓰는 방법으로이 문제를 해결했다.단일 함수 호출로 여러 파일 설명자에 쓰기

이제 문제에 대한 더 나은 해결책을 찾고자합니다. Linux에서 tee 시스템 호출을 사용하여 서버에서 단일 함수 호출로이 작업을 수행 할 수 있습니까? 한 티의 출력이 다음 티와 클라이언트 소켓으로 연결되기를 바랍니다. 나는 클라이언트 소켓에 티의 한쪽 끝의 파일 설명자를 dup하고 원하는 효과를 얻을 수 있는지 궁금합니다.

알고 계신 유스 케이스에 대한 다른 구현을 제안하십시오.

감사

+0

당신은 이것으로 무엇을 얻을 것이라고 생각합니까? – JeremyP

+0

사용 사례에서 언급했듯이, 한 번 (단일 시스템 호출을 사용하여) 여러 파일 설명자에 쓸 수 있기를 원합니다. 나는 티를 실험하고 있었고 티가 이것을 달성하는데 유용하지 않을 것이라는 것을 깨달았다. –

답변

2

tee(2) 시스템 호출은 파이프로 두 파일 기술자가 필요합니다 - 그래서 소켓은 포함되지 않습니다. splice(2)vmsplice(2) 시스템 호출도 사용자의 요구 사항을 충족시키지 못하고 sendfile(2)을 사용하는 방법을 알지 못합니다.

나는 그런 시스템 호출을 발견하지 못했다. 다양한 데이터 수집 및 즉시 작성 (또는 읽는 것을위한 대화) - 예. 그러나 한 번에 여러 출력에 쓰기 위해 - 아니오.

따라서 '설명자를 둘러싼 루프'는 AFAICT만큼 훌륭합니다.

+0

Heh, 조금 늦었지만 그럼에도 불구하고 티, 스플 라이스 및 vmplice가 실제로 OP가 사용하기를 원할 것입니다. 데이터를 파이프 (커널 버퍼)에 넣고 다른 파이프를'tee'하고 모든 소켓에 대해 한 번씩'splice (MOVE) '를 한 후,'vmsplice (GIFT)'를 먼저합니다. 문제는 문서가 복제물을 피할 때 어떤 플래그를 사용하는지 정확하게 파악하지 못하거나 "복사 말하기"와 일관성이 없지만 대부분의 경우 페이지 테이블 마법입니다. "선전. 언제/당신이 당신의 기억을 재사용/재사용 할 수 있는지, 또는 무엇인가가 차단 될 때, 확실하지 않습니다. – Damon

관련 문제