为什么sendto()一个Unix域数据报套接字返回EPERM?

时间:2014-10-21 08:51:40

标签: linux sockets ipc unix-socket

在某些情况下,在多进程应用程序中的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(到其他套接字)之前成功了怎么办?

0 个答案:

没有答案