首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SocketCAN:如何查询缓冲区使用情况

SocketCAN:如何查询缓冲区使用情况
EN

Stack Overflow用户
提问于 2020-10-20 17:04:43
回答 1查看 2.9K关注 0票数 2

我正试图确定我在linux上的CAN接口的缓冲区使用情况。

在接口级别,我知道两种获取统计数据的方法:

/proc/net/can/stats

  • ip -details -statistics link show can0

第一个给出了发送/接收帧的数目。第二种方法给出了发送/接收的字节和数据包的数量,以及丢弃的数据包和溢出的数量。不幸的是,这两种方法都没有显示缓冲区中当前的帧/字节数。

注意:我知道我们可以设置txqueuelen (ifconfig can0 txqueuelen <len>),并将其设置得太低会在填充时触发write: No buffer space available。但是,我仍然无法在任何时候获得队列中的帧数。

在套接字级别(套接字是像这样打开的:socket(PF_CAN, SOCK_RAW, CAN_RAW)),我尝试查询输入/输出队列大小(可以在internet套接字上这样做):

代码语言:javascript
运行
复制
int queued_in = -1;
ioctl(sockfd, SIOCINQ, &queued_in);
int queued_out = -1;
ioctl(sockfd, SIOCOUTQ, &queued_out);

但是这两个变量的值仍然是-1,所以它没有写到。我在这里做错什么了?

EN

回答 1

Stack Overflow用户

发布于 2020-10-26 13:32:54

我不知道有什么方法可以查询内核缓冲区的当前大小,只有它们的最大容量。但是,您可以在/sys/class/net/can0/queues/tx-0和类似目录下找到传输队列的一些统计信息。

即使可以在内核缓冲区中获得当前帧数,回答问题也是很复杂的,因为涉及到多个缓冲区。除了网络接口的发送队列之外,还有套接字的发送缓冲区。这两者之间的交互可能会导致一些意想不到的行为(有关更多细节,请参见https://rtime.felk.cvut.cz/can/socketcan-qdisc-final.pdf中的3.4节)。除此之外,Linux还允许您添加具有不同队列规则的额外队列(PDF中也解释了这一点)。您必须将所有这些缓冲区的大小相加,才能得到缓冲帧的总数。但这些缓冲区的变化可能比查询它们的大小所需的时间还要快。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64450019

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档