环顾四周,但找不到任何证明AF_UNIX套接字答案的链接。
我的实现是在linux系统上,我有一个AF_UNIX SOCK_STREAM套接字,
我的问题是 - 是AF_UNIX socket' send()'线程安全?如果我在AF_UNIX套接字fd上并行/同时调用send,那么内核会处理同步吗?
我经历了多个链接,但都与TCP / UDP(AF_INET)套接字有关,所以如果有人可以建议一个证明答案合理的链接,或者可以提供对内核代码的一些了解,那将会有很大帮助
答案 0 :(得分:6)
POSIX specifies它定义的所有函数必须是线程安全的,除了特定异常列表上的那些函数。 send(2)
函数由POSIX定义,不包含在异常列表中。由于send(2)
的Linux实现声称符合POSIX规范,因此您可以依赖它来保证线程安全。
答案 1 :(得分:1)
通常,读取或写入等操作都是原子操作。但是在管道或插座上的东西是不同的。
对于管道,POSIX,但我怀疑Linux在这一点上是合规的,并指出只有当length小于PIPE_BUF
时才保证并发写入不会被交错。请参阅POSIX write。
对于套接字,send
家庭功能的Linux手册说:
当消息不适合套接字的发送缓冲区时, send()通常会阻塞,除非插入了套接字 非阻塞I / O模式。
这表明内核可能send
将您的消息分成几部分,就像管道语义一样。
此主题Is send atomic?提供了答案。