Tamas Szakaly
2018-09-10 08:58:33 UTC
Hi,
I have a question about the recvmsg syscall. According to POSIX, unless
O_NONBLOCK is set on the socket fd, recvmsg [1] should block until a message
arrives. However, recvmsg returns immediately with 0, if we are trying to
receive a 0-byte message from a SOCK_SEQPACKET AF_UNIX socket. Consider the
following code:
#include <stdio.h>
#include <sys/socket.h>
int main(int argc, char** argv) {
int sock[2];
socketpair(AF_UNIX, SOCK_SEQPACKET, 0, sock);
struct msghdr msghdr = {0};
int ret = recvmsg(sock[1], &msghdr, 0);
printf("ret=%d, msghdr.msg_flags=0x%08x\n\n", ret, msghdr.msg_flags);
}
Running this yields this output:
[0x00 socketstuff]$ cc socketpair.c -o socketpair && ./socketpair
ret=0, msghdr.msg_flags=0x00000000
You can see that recvmsg returns with 0, even though there were no messages
sent, and neither of the sockets are closed, so it should block indefinitely.
Is this behavior intentional to match the semantics of read [2] (i.e.
attempting to read zero bytes should be a no-op)?
[1] recvmsg: http://pubs.opengroup.org/onlinepubs/9699919799/functions/recvmsg.html
[2] read: http://pubs.opengroup.org/onlinepubs/9699919799/functions/read.html
I have a question about the recvmsg syscall. According to POSIX, unless
O_NONBLOCK is set on the socket fd, recvmsg [1] should block until a message
arrives. However, recvmsg returns immediately with 0, if we are trying to
receive a 0-byte message from a SOCK_SEQPACKET AF_UNIX socket. Consider the
following code:
#include <stdio.h>
#include <sys/socket.h>
int main(int argc, char** argv) {
int sock[2];
socketpair(AF_UNIX, SOCK_SEQPACKET, 0, sock);
struct msghdr msghdr = {0};
int ret = recvmsg(sock[1], &msghdr, 0);
printf("ret=%d, msghdr.msg_flags=0x%08x\n\n", ret, msghdr.msg_flags);
}
Running this yields this output:
[0x00 socketstuff]$ cc socketpair.c -o socketpair && ./socketpair
ret=0, msghdr.msg_flags=0x00000000
You can see that recvmsg returns with 0, even though there were no messages
sent, and neither of the sockets are closed, so it should block indefinitely.
Is this behavior intentional to match the semantics of read [2] (i.e.
attempting to read zero bytes should be a no-op)?
[1] recvmsg: http://pubs.opengroup.org/onlinepubs/9699919799/functions/recvmsg.html
[2] read: http://pubs.opengroup.org/onlinepubs/9699919799/functions/read.html
--
Tamas Szakaly
@sghctoma
Tamas Szakaly
@sghctoma