在某些情况下,在多进程应用程序中的Linux 2.6.34 ppc系统上,两个PF_UNIX套接字之间的sendto()
返回-1和errno
EPERM
。我在手册页中可以找到的EPERM
唯一提到的是UNIX(7):
EPERM
发件人在 struct ucred 中传递了无效凭据。
但这不适用于sendto()
,可以吗?不幸的是,我无法整理一个简短的,自包含的例子来重现问题。这是事件的一部分:
socket(PF_FILE, SOCK_DGRAM, 0) = 3 bind(3, {sa_family=AF_FILE, path=@"PIO "}, 11) = 0 ... sendto(3, "PIO \0\7\0\20\1\232\1\10\4\1\0\4\20\2\202\30\0\2\0\0", 24, MSG_DONTWAIT, {sa_family=AF_FILE, path=@"PWE7"}, 11) = 24 ... recv(3, "PAD \0#\0\2\3\347", 2008, 0) = 10 recv(3, "PAD \0#\0\2\3\347", 2008, 0) = 10 recv(3, "PAD \0#\0\2\3\347", 2008, 0) = 10 recv(3, "DBUG\0(\0\n\1\250\0\3\0\1\0\1\0\1", 2008, 0) = 18 sendto(3, "PIO \0\3\0\30\1\303\0\3\0\1\0\1\0\1\0\1\20\2\202\34\0\2\0\0\0\2\0\0", 32, MSG_DONTWAIT, {sa_family=AF_FILE, path=@"DBUG"}, 11) = -1 EPERM (Operation not permitted) recv(3, "PAD \0#\0\2\3\347", 2008, 0) = 10 recv(3, "PAD \0#\0\2\3\347", 2008, 0) = 10 recv(3, "PAD \0#\0\2\3\347", 2008, 0) = 10 ...
让EPERM
从一个套接字收到定期消息"PAD ..."
之前和之后从另一个套接字收到一条消息"DBUG..."
的进程将使用sendto()
响应。现在,这个sendto()
如何以EPERM
失败,而其他sendto()
s(到其他套接字)之前成功了怎么办?