在Linux内核代码(最多3.1.*)中,我看到了这样的结构定义:
struct skb_frag_struct {
struct page *page;
/* ... */
Run Code Online (Sandbox Code Playgroud)
在较新的内核版本中,这已演变为:
struct skb_frag_struct {
struct {
struct page *p;
} page;
/* ... */
Run Code Online (Sandbox Code Playgroud)
在这种特殊情况下,这种包装可以用于什么目的?为什么在一般情况下可能需要它?
我编写了基于 Berkeley 套接字的用户模式客户端 - 服务器c应用程序,这些套接字通过一些专用网络进行交互。
情况肯定很奇怪。有时,在某些模糊的情况下,连接会变得非常缓慢。在我的例子中,正常的 TCP 数据交换是每段大约 10-25 KB 的有效载荷,但有时它变成每段大约 200-500 字节。
经过一些故障排除后,我意识到这个问题对于其他网络服务是不可重现的,因此看起来应该归咎于我的服务。但我想不通,怎么了。它在 3.10 Linux 内核上运行良好,但在 4.4 上有这种奇怪的行为。是否是一些内部内核更改导致了此类问题?
我尝试使用 Linuxsysctl设置:
net.ipv4.tcp_congestion_control
net.ipv4.tcp_sack
net.ipv4.route.flush
Run Code Online (Sandbox Code Playgroud)
但这没有帮助。
似乎问题出现在侦听套接字端。在tcpdumpTCP 窗口大小在握手时是确定的。但是在第一个传入数据包窗口大小减小后(在侦听器方面)。
UPD
这是我的服务器端代码片段:
serv_fd = socket(AF_INET, SOCK_STREAM, 0);
if (serv_fd == -1) {
perror("socket");
return;
}
server.sin_family = AF_INET;
server.sin_port = htons(LISTEN_PORT);
server.sin_addr.s_addr = htonl(INADDR_ANY);
#ifdef SET_BUF
if (setsockopt(serv_fd, SOL_SOCKET, SO_RCVBUF, &buflen, sizeof(int)) == -1) {
perror ("setsockopt");
return;
}
if (setsockopt(serv_fd, SOL_SOCKET, SO_SNDBUF, …Run Code Online (Sandbox Code Playgroud) Linux 内核模块中的一些简单预处理器代码会出现以下错误:
标记“(”之前缺少二元运算符
代码:
#if defined(AAA) || defined(BBB)
#if LINUX_VERSION_CODE <= KERNEL_VERSION(3,13,0)
#define SOME 111
#else
#define SOME 222
#endif
#define OTHER 999
#else
#define SOME 1
#define OTHER 9
#endif /* AAA || BBB */
Run Code Online (Sandbox Code Playgroud)
那个帖子没有帮助。
假设我有一些这样的代码:
void foo (void *ptr) {
const struct some *azaza = (const struct some *)ptr;
azaza->some_field = 123; // inadvertently assignment => error
// ...
Run Code Online (Sandbox Code Playgroud)
在const符真正需要的投?
编辑:foo是的回调具有功能特定的原型,我不能改变(这不是在我的代码)。
有一些带有单词的字符串,用空格分隔.我需要在每个单词中获得一个带有特定子串的单词数组,这些单词应该是唯一的.它可以这样做:
%arr = map { $_ => 1 } grep /foo/, $str=~/\b(\w+)\b/g;
@arr = keys %arr;
Run Code Online (Sandbox Code Playgroud)
但这是单线,我试图做到简洁:
@arr = keys map { $_ => 1 } grep /foo/, $str=~/\b(\w+)\b/g;
Run Code Online (Sandbox Code Playgroud)
但是我得到了错误(在Perl 5.24.1中):
现在禁止使用标量上的实验键
我处理了netlink API 并检查了它的手册页netlink(3)和netlink(7)。
突然我面临这样的构造:
struct msghdr msg;
msg = { &sa, sizeof(sa), &iov, 1, NULL, 0, 0 };
Run Code Online (Sandbox Code Playgroud)
我在 C 中尝试过,但它给出了错误:
错误:'{' 标记前的预期表达式
显然它是c++(我不知道什么标准)。
当然,很明显,Netlink 是一个 API,没有特定的语言绑定。但这是 C 实现,我见过的关于 C API 的所有 MAN 页面都有纯 C 示例。为什么没有关于示例中使用的语言的注释?这种做法是为了什么,为什么这不是 Python 或其他什么东西?
UPD:我不认为这是 MAN 页面中的拼写错误或无意错误。还有一些其他地方使用了这个 C++ 特性,例如:
struct iovec iov = { buf, sizeof(buf) };
struct sockaddr_nl sa;
struct msghdr msg;
struct nlmsghdr *nh;
msg = { &sa, sizeof(sa), &iov, 1, NULL, 0, 0 };
len = …Run Code Online (Sandbox Code Playgroud)