小编red*_*0ct的帖子

508
推荐指数
8
解决办法
5万
查看次数

Linux:是否有超时的套接字读取或recv?

如何尝试从超时的套接字读取数据?我知道,select,pselect,poll,有一个超时字段,但使用它们会禁用tcp reno stack中的"tcp fast-path".

我唯一的想法是在循环中使用recv(fd,...,MSG_DONTWAIT)

c sockets linux tcp

92
推荐指数
2
解决办法
13万
查看次数

在Linux内核模块中读/写文件

我知道所有关于为什么不应该从内核读/写文件的讨论,而是如何使用/ procnetlink来做到这一点.无论如何我想读/写.我也读过" 驾驶我的坚果 - 你应该在内核中做的事情".

但问题是2.6.30不能导出sys_read().相反,它包含在内SYSCALL_DEFINE3.因此,如果我在我的模块中使用它,我会收到以下警告:

WARNING: "sys_read" [xxx.ko] undefined!
WARNING: "sys_open" [xxx.ko] undefined!
Run Code Online (Sandbox Code Playgroud)

显然insmod无法加载模块,因为链接没有正确发生.

问题:

  • 如何在2.6.22之后在内核中读/写(哪里sys_read()/ sys_open()不导出)?
  • 一般来说,如何使用SYSCALL_DEFINEn()内核中包含宏的系统调用?

c file-io kernel-module linux-kernel

89
推荐指数
2
解决办法
10万
查看次数

在结构数组的末尾需要空大括号“{}”吗?

我在 Linux 内核中打了一些 代码

static struct ctl_table ip_ct_sysctl_table[] = {
    {
        .procname   = "ip_conntrack_max",
        .maxlen     = sizeof(int),
        .mode       = 0644,
        .proc_handler   = proc_dointvec,
    },
    // ...
    {
        .procname   = "ip_conntrack_log_invalid",
        .maxlen     = sizeof(unsigned int),
        .mode       = 0644,
        .proc_handler   = proc_dointvec_minmax,
        .extra1     = &log_invalid_proto_min,
        .extra2     = &log_invalid_proto_max,
    },
    { }
};
Run Code Online (Sandbox Code Playgroud)

这里的结构数组以{ }. 添加的目的是什么?
顺便说一句,在这段代码上方有另一个structs 数组,但最后没有空大括号。

什么时候应该在结构数组的末尾使用空大括号?

c arrays struct linux-kernel

60
推荐指数
4
解决办法
3810
查看次数

如何重新编译单个内核模块?

通常内核源存储在/usr/src/linux-2.6.x/.如果我修改模块的源代码,为了避免重新编译整个内核,我该如何重新编译该模块?

linux makefile gnu-make kernel-module linux-kernel

48
推荐指数
4
解决办法
4万
查看次数

如何使用netlink socket与内核模块通信?

我正在尝试编写一个使用netlink与用户进程通信的linux内核模块.我正在使用netlink,因为我想要通信的用户程序只使用套接字进行通信,我无法改变它来添加ioctl()或任何东西.

问题是我无法弄清楚如何做到这一点.我用Google搜索,但我发现所有的例子都是老喜欢这一个,不再适用于当前的内核版本.我也看了这个问题,但这里的示例使用libnl进行套接字操作,但我想坚持使用标准套接字函数(定义sys/socket.h).那么有些人可以在这里指导我一些教程或指南或一些可以帮助我理解netlink的界面和用法的东西.我非常感谢一个工作示例,没什么特别的,只是一个非常基本的例子,说明如何建立从用户程序中的套接字到内核中的套接字的连接,然后将数据从用户进程发送到内核并从内核接收回来.

另请不要告诉我查看内核代码.我已经在做了,但这需要花费很多时间,而且我没有留下很多东西.

更新: 经过大量的试验和错误后,我有以下代码将消息从用户程序发送到内核,但是从内核到用户程序的消息即使用netlink_unicast()不起作用.它不仅没有工作,呼叫挂起系统,然后我必须重新启动机器.有人可以看看,告诉我我在做什么错.该netlink_unicast()调用在以下代码中进行了注释.它应该是内核到用户程序消息的未注释.

用户程序

#include <sys/socket.h>  
#include <linux/netlink.h>  
#define NETLINK_USER 31  
#define MAX_PAYLOAD 1024  /* maximum payload size*/  

struct sockaddr_nl src_addr, dest_addr;  
struct nlmsghdr *nlh = NULL;  
struct iovec iov;  
int sock_fd;  
struct msghdr msg;  

void main()  
{  
    sock_fd=socket(PF_NETLINK, SOCK_RAW, NETLINK_USER);  
    if(sock_fd<0)  
        return -1;  

    memset(&src_addr, 0, sizeof(src_addr));  
    src_addr.nl_family = AF_NETLINK;  
    src_addr.nl_pid = getpid();  /* self pid */  
    /* interested in group 1<<0 */  
    bind(sock_fd, …
Run Code Online (Sandbox Code Playgroud)

c linux-device-driver linux-kernel netlink

45
推荐指数
3
解决办法
6万
查看次数

如何将原始套接字绑定到特定接口

我的应用程序在CentOS 5.5上运行.我正在使用原始套接字发送数据:

sd = socket(AF_INET, SOCK_RAW, IPPROTO_RAW);
if (sd < 0) {
  // Error
}
const int opt_on = 1;
rc = setsockopt(m_SocketDescriptor, IPPROTO_IP, IP_HDRINCL, &opt_on, sizeof(opt_on));
if (rc < 0) {
  close(sd);
  // Error
}
struct sockaddr_in sin;
memset(&sin, 0, sizeof(sin));
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = my_ip_address;

if (sendto(m_SocketDescriptor, DataBuffer, (size_t)TotalSize, 0, (struct sockaddr *)&sin, sizeof(struct sockaddr)) < 0)  {
  close(sd);
  // Error
}
Run Code Online (Sandbox Code Playgroud)

如何将此套接字绑定到特定的网络接口(例如eth1)?

c sockets linux network-programming raw-sockets

30
推荐指数
2
解决办法
7万
查看次数

使用modprobe"致命:模块未找到错误"

我有一个modprobe命令问题...我编译了hello world模块并加载它insmod,它工作正常,当我这样做时lsmod,我可以在输出列表中看到它.但是当我使用插入此模块时,我modprobe收到致命错误:

root@okapi:/home/ravi# modprobe ./hello.ko 
FATAL: Module ./hello.ko not found.
root@okapi:/home/ravi#
Run Code Online (Sandbox Code Playgroud)

这是模块代码:

#include <linux/init.h>
#include <linux/module.h>

MODULE_LICENSE("Dual BSD/GPL");

static int hello_init(void)
{
        printk(KERN_ALERT "Hello, world\n");
        return 0;
}
static void hello_exit(void)
{
        printk(KERN_ALERT "Goodbye, cruel world\n");
}

module_init(hello_init);
module_exit(hello_exit);
Run Code Online (Sandbox Code Playgroud)

和Makefile

obj-m += hello.o

all:
        make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

clean:
        make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
Run Code Online (Sandbox Code Playgroud)

c linux kernel linux-device-driver linux-kernel

23
推荐指数
2
解决办法
14万
查看次数

找不到gcc-arm-linux-gnueabi命令

我正在尝试为ubuntu安装gnu arm工具链.我首先从CodeSourcery下载了tar.但是当我进入bin文件夹时,我无法运行任何二进制文件.我已经尝试过./而没有把它放在PATH中,它一直告诉我"Command not Found"但文件就在我面前的文件夹中.然后我尝试了sudo apt-get install gcc-arm-linux-gnueabi,除非它说已成功安装,我找不到它的地方gcc-arm-linux-gnueabi.有人可以帮忙吗?

linux ubuntu gcc arm gnu

23
推荐指数
7
解决办法
14万
查看次数

UDP校验和计算

在/usr/include/netinet/udp.h中定义的UDP头结构如下

struct udphdr
{
  u_int16_t source;
  u_int16_t dest;
  u_int16_t len;
  u_int16_t check;
};
Run Code Online (Sandbox Code Playgroud)

标题的检查字段中存储了什么值?如何验证校验和是否正确?我的意思是校验和计算的数据是什么?(它只是udp头或udp头加上它后面的有效负载吗?)

谢谢.

c checksum udp network-programming

21
推荐指数
1
解决办法
8万
查看次数