gpt4 book ai didi

linux - 为什么 sendto() a Unix domain datagram socket (`socket(PF_FILE, SOCK_DGRAM, 0)` ) 返回 EPERM?

转载 作者:行者123 更新时间:2023-12-05 06:45:04 24 4
gpt4 key购买 nike

在 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 using socket(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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com