- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 Linux 2.6.34 ppc 系统上,在某些情况下的多进程应用程序中,两个 PF_UNIX 套接字之间的 sendto()
返回 -1 和 errno
EPERM
。我可以在手册页中找到的此上下文中唯一提到的 EPERM
是在 UNIX(7) 中:
EPERM
The sender passed invalid credentials in the struct ucred.
但这不适用于sendto()
,不是吗?不幸的是,我还不能组合一个简短的、独立的例子来重现这个问题。这是事件的一部分:
socket(PF_FILE, SOCK_DGRAM, 0) = 3bind(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) = 10recv(3, "PAD \0#\0\2\3\347", 2008, 0) = 10recv(3, "PAD \0#\0\2\3\347", 2008, 0) = 10recv(3, "DBUG\0(\0\n\1\250\0\3\0\1\0\1\0\1", 2008, 0) = 18sendto(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) = 10recv(3, "PAD \0#\0\2\3\347", 2008, 0) = 10recv(3, "PAD \0#\0\2\3\347", 2008, 0) = 10...
获取 EPERM
的进程从一个套接字接收周期性的消息 "PAD ..."
之前和之后从另一个套接字接收消息 "DBUG ..."
应使用 sendto()
响应。现在,这个 sendto()
怎么会因为 EPERM
而失败,而其他 sendto()
(到其他套接字)之前却成功了?
最佳答案
更新:OP 帮助我理解下面的答案没有回答他的问题,因为他问的是 UNIX
域套接字,是用 socket(PF_FILE, ..., . ..)
,不管是什么意思 :),我正在回答有关 IP
套接字的问题,它是用 socket(AF_INET, ..., ...)
创建的.
因此,对于 UNIX 域套接字,这可能不相关。而且,对于 AF_INET
IP 域套接字,请参阅我刚刚在此处添加的其他问答:How to fix EPERM
error when trying to use sendto()
with Ethernet socket(AF_INET, ..., ...)
(IP output packets) on Linux。
这是我在这个问题下的相关评论:
@Armali, you are correct. I am mistaken. Thanks for the clarification. I'll ask a new Q&A and move my answer when I get a chance. I was using
socket(AF_INET, ..., ...)
, similar to this example I wrote here, and mistakenly thought you had done the same. I didn't realize you are usingsocket(PF_FILE, ..., ...)
. You're right. I don't know anything about that usage.
EPERM
(权限错误;'E'rror 'PERM'issions)经过大量研究、谷歌搜索、在嵌入式 Linux 主板上进行测试等,我确定这仅仅是因为您的防火墙阻止了您的流量。执行此操作以禁用防火墙,然后重试,EPERM
错误将消失:
# Manually disable the firewall
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -t filter --flush
关于linux - 为什么 sendto() a Unix domain datagram socket (`socket(PF_FILE, SOCK_DGRAM, 0)` ) 返回 EPERM?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26482579/
我是一名优秀的程序员,十分优秀!