小编z0l*_*pka的帖子

将指针包装在C中的结构中的目的

在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)

在这种特殊情况下,这种包装可以用于什么目的?为什么在一般情况下可能需要它?

c struct pointers linux-kernel skb

9
推荐指数
1
解决办法
140
查看次数

Linux 中 TCP 连接异常缓慢

我编写了基于 Berkeley 套接字的用户模式客户端 - 服务器应用程序,这些套接字通过一些专用网络进行交互。
情况肯定很奇怪。有时,在某些模糊的情况下,连接会变得非常缓慢。在我的例子中,正常的 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)

c sockets network-programming tcp linux-kernel

7
推荐指数
1
解决办法
2468
查看次数

Linux 内核错误:标记“(”之前缺少二元运算符

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)

那个帖子没有帮助。

c kernel-module linux-kernel c-preprocessor

3
推荐指数
1
解决办法
1698
查看次数

强制转换说明符的必要性

假设我有一些这样的代码:

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的回调具有功能特定的原型,我不能改变(这不是在我的代码)。

c linux gcc casting const

3
推荐指数
1
解决办法
76
查看次数

为什么信号在 Linux 中是平台相关的?

SIGNAL(7) 手册页指出:

下表给出了每个信号的数值。如表所示,许多信号在不同的架构上具有不同的数值
......

的确。在 Linux 内核源代码中,我们可以确保 fe 与SIGTERM- 这里是一堆针对不同架构的signal.h文件。

那么如果是操作系统级别的,并且与硬件没有明确的关系,为什么会有这样的平台依赖性?为什么 Linux 不能在所有支持的平台上平等地处理它?

PS 这个帖子没有帮助。

c linux posix signals linux-kernel

3
推荐指数
1
解决办法
94
查看次数

从地图中检索哈希键

有一些带有单词的字符串,用空格分隔.我需要在每个单词中获得一个带有特定子串的单词数组,这些单词应该是唯一的.它可以这样做:

%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中):

现在禁止使用标量上的实验键

不幸的是,12帖子没有帮助我理解应该如何正确完成.

regex perl hashmap

2
推荐指数
1
解决办法
58
查看次数

为什么 Linux NETLINK 手册页提供 C++ 示例而不提供 C?

我处理了 API 并检查了它的手册页netlink(3)netlink(7)
突然我面临这样的构造:

struct msghdr msg;

msg = { &sa, sizeof(sa), &iov, 1, NULL, 0, 0 };
Run Code Online (Sandbox Code Playgroud)

我在 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)

c c++ linux manpage netlink

2
推荐指数
1
解决办法
677
查看次数