현재 Linux 환경에서 C를 사용하여 소켓 프로그래밍을 배우고 있습니다. 프로젝트로서 나는 기본적인 채팅 서버와 클라이언트를 작성하려고 시도하고있다.동일한 파이프에서 여러 자식 프로세스 읽기/쓰기
의도는 서버가 연결하는 각 클라이언트에 대한 프로세스를 포크하게하는 것입니다.
내가 겪고있는 문제는 한 어린이의 데이터를 읽고 연결된 모든 클라이언트에게 쓰는 것입니다.
데이터를 소켓에 도착 시키거나 파이프의 끝을 읽는 것을 기다리는 하위에서 select를 호출하여 루핑하여이 작업을 수행하려고했습니다. 소켓에 도착하면 파이프의 쓰기 끝 부분에 쓰기를 수행하여 select가 파이프의 읽기 끝을 읽을 준비가 된 것으로 반환하도록합니다.
이 파이프는 모든 자식간에 공유되므로 각 자식은 파이프의 데이터를 읽어야합니다. 이는 데이터 파이프가 동시에 나타나지 않고, 동시에 각 하위 프로세스에서 읽을 수 없으며 읽기 호출에서 데이터 블록을 "잃어 버리는"자식으로도 작동하지 않기 때문에 작동하지 않습니다.
for(; ;)
{
rset = mset;
if(select(maxfd+1, &rset, NULL, NULL, NULL) > 0)
{
if(FD_ISSET(clientfd, &rset))
{
read(clientfd, buf, sizeof(buf));
write(pipes[1], buf, strlen(buf));
}
if(FD_ISSET(pipes[0], &rset))
{
read(pipes[0], buf, sizeof(buf));
write(clientfd, buf, sizeof(buf));
}
}
}
나는 현재 작동하지 않습니다 단순히 사용하고있는 방법을 추정하고 있습니다 :
다음은이 작업을 수행 자식 프로세스의 코드입니다. 클라이언트로부터받은 메시지가 IPC를 통해 연결된 다른 모든 클라이언트에 쓰여질 수 있습니까?
감사
응답 해 주셔서 감사합니다. – synic
BTW, 파이프에 여러 독자가있는 것과 관련된 또 다른 문제는 파이프에 대한 읽기가 원자 적이 지 않다는 것입니다. 즉,'read' 호출이 있으면'read '에 대한 단일 호출에서 전체 메시지를 얻을 수 없습니다 '. 여러 독자와 경합이 있으면 데이터 손상 문제가 발생할 수 있습니다. 크기'PIPE_BUF '까지의'write' 연산은 원자 적입니다 만,'read'를 호출한다는 사실은 다중 바이트 또는 가변 길이 데이터를 읽는다면 단일 파이프의 다중 독자가 상당히 고통 스러울 수 있음을 의미하지 않습니다 -끈. – Jason
아 좋아, 한 프로세스가 FD에서 읽기를 호출하면 데이터의 나머지 부분을 얻기 위해 다시 루프를 호출해야합니다.이 갭에서 다른 프로세스가 다른 프로세스가 읽기를 "훔쳐"다른 것을 잠글 수있는 가능성이 있습니까? – synic