생산자는 Unix 도메인 소켓을 통해 소비자에 연결됩니다.

생산자는 Unix 도메인 소켓을 통해 소비자에 연결됩니다.

나는 이것을 가지고있다:

producer-client | consumer-server

소비자는 유닉스 도메인 소켓(유사)에서 수신 대기하는 TCP 서버를 시작하고 클라이언트(생산자)는 여기에 연결됩니다.

그러나 분명히 경쟁 조건이 있습니다. 이제 소비자가 나타나 연결 수신을 시작할 때까지 기다리는 시간 제한은 약 500ms밖에 없습니다. 내 질문은 - 내가 들을 수 있는 이벤트가 있나요? 시간 초과 후에 연결을 폴링하고 테스트할 수 있다고 생각했습니다. 해당 Unix 도메인 소켓에서 무언가가 수신되고 있는지 확인하기 위해 폴링하는 데 사용할 수 있는 동기화 유틸리티가 있습니까?

업데이트 #1

따라서 소비자에서는 파일을 삭제/링크 해제한 다음 수신을 시작합니다. 생산자에서 파일이 존재하지 않으면 파일을 생성한 다음 inotify변경 사항이 발생하면 수신 대기하는 데 사용합니다. 변경하고 서버를 알고 있습니다. 소비자가 지금 듣고 있습니다.

답변1

producer-client및 파이프가 아닌 consumer-server소켓을 통해 통신하는 경우 파이프에서 실행하면 안 됩니다.

그래서 대신

consumer-server &
sleep 2
producer-client &

wait

그러면 서버가 백그라운드 작업으로 시작되고, 서버가 모든 것을 초기화할 때까지 2초간 기다린 다음, 클라이언트도 백그라운드 작업으로 시작됩니다. 그런 다음 스크립트는 둘 다 종료될 때까지 기다립니다.

당신이 제안한 것처럼 클라이언트는 소켓 파일이 나타날 때까지 기다릴 수도 있습니다. 여기서는 사용되지 않습니다 inotify.

consumer-server &

while [ ! -S /path/to/socket ]; do
    echo Waiting for socket to appear... >&2
    sleep 1
done
producer-client &

wait

루프 while(또는 이에 상응하는물건)은 내부적으로 수행되는 작업의 일부일 수도 있습니다 producer-client.


서버와 클라이언트가 파이프를 통해 통신하지 않는 경우 파이프는

producer-client | consumer-server

본질적으로 동일

producer-client &
consumer-server

내가 제안한 명령 세트(위)는 두 호출 사이에 짧은 지연을 삽입하도록 이를 수정하고 클라이언트를 백그라운드 작업으로 실행합니다(꼭 필요한 것은 아님).

관련 정보