2017-09-22 13 views
2

원자가 란 성공 또는 실패를 의미하며 아무 것도하지 않습니다. 여러 프로세스/스레드가 write(fd, buf, len)를 호출하면 내가 socketpair(AF_LOCAL, SOCK_STREAM) 알고SOCK_SEQPACKET 원자에 쓸 수 있습니까?

이 원자되지는 write()의 반환 값은 아마 > 0 && < len이나 고장의 데이터를 발생합니다.

socketpair(AF_LOCAL, SOCK_SEQPACKET)으로 생성 된 write(buf, len)에서 sock_fd까지 여러 프로세스/스레드가있는 경우 원자입니까?

나는 리눅스 설명서를 확인하고 lenPIPE_BUF보다 작 으면 write/writev이 원자 단위라는 것을 알리는 pipe()에 대해 발견했다.

socketpair에 대해 아무 것도 발견되지 않았습니다. 나는 테스트 코드를 작성하여 SOCK_SEQPACKET이 원자적임을 알았고, 랜덤 길이 버퍼를 fd에 쓰고 반환 값은 항상 -1 또는 len입니다.

답변

1

예.

데이터 그램 기반 인터페이스 (예 : 에 전달하는 크기는 read의 사람에게 표시됨)은 원자이어야합니다. 그 재산을 보증 할 다른 방법은 없습니다.

따라서 SOCK_SEQPACKETSOCK_DGRAM은 작동하기 위해 원자이어야합니다.

매우 동일한 이유 때문에 SOCK_STREAM에는 이러한 분무 보증이 없습니다.