限制来自变量sysctl_wmem_default.它可以在proc文件系统中查看:/proc/sys/net/core/wmem_max
在这一点上,不同的Linux版本可能有不同的实现.但是UNIX域套接字有这种代码:
sk->sk_sndbuf = sysctl_wmem_default;
Run Code Online (Sandbox Code Playgroud)
和
err = -EMSGSIZE;
if (len > sk->sk_sndbuf - 32)
goto out;
Run Code Online (Sandbox Code Playgroud)
所以实际的限制是:/ proc/sys/net/core/wmem_max的值减去32.我不知道这个神奇数字在版本之间有多大变化./ proc/sys/net/core/wmem_max的值似乎因可用的ram页面而异.
在我的linux框中,值为105472.最大数据报大小(使用AF_UNIX和SOCK_DGRAM时)为105440.如果我尝试发送大小为105441的消息,它将失败并显示EMSGSIZE.