c - sendto 失败 UNIX 域套接字

标签 c linux embedded-linux

sendto 系统调用失败,错误为“没有可用的缓冲区空间”,错误代码为“ENOMEM”。这似乎是 kmalloc 在 sendto 中的失败。当我读到它时,我了解到它可能会由于连续内存不可用而失败。但是,系统有足够的空闲内存。我不确定为什么 kmalloc 会失败。

PS:我在嵌入式硬件中运行应用程序。

发送失败时的错误信息:

MYAPP: page allocation failure. order:5, mode:0x4d0
[<c002b2a8>] (unwind_backtrace+0x0/0xcc) from [<c0063de0>] (__alloc_pages_internal+0x39c/0x3bc)

[<c0063de0>] (__alloc_pages_internal+0x39c/0x3bc) from [<c0294f40>] (cache_alloc_refill+0x264/0x514)

[<c0294f40>] (cache_alloc_refill+0x264/0x514) from [<c007a7e0>] (__kmalloc+0x84/0xd8)

[<c007a7e0>] (__kmalloc+0x84/0xd8) from [<c0213f88>] (__alloc_skb+0x44/0xf4)

[<c0213f88>] (__alloc_skb+0x44/0xf4) from [<c020fa2c>] (sock_alloc_send_pskb+0x94/0x2f8)

[<c020fa2c>] (sock_alloc_send_pskb+0x94/0x2f8) from [<c020fca8>] (sock_alloc_send_skb+0x18/0x1c)

[<c020fca8>] (sock_alloc_send_skb+0x18/0x1c) from [<c0273830>] (unix_dgram_sendmsg+0x168/0x44c)

[<c0273830>] (unix_dgram_sendmsg+0x168/0x44c) from [<c020d47c>] (sock_sendmsg+0xac/0xcc)

[<c020d47c>] (sock_sendmsg+0xac/0xcc) from [<c020e3fc>] (sys_sendto+0xb0/0xd4)

[<c020e3fc>] (sys_sendto+0xb0/0xd4) from [<c0025c00>] (ret_fast_syscall+0x0/0x2c)

Mem-info:

Normal per-cpu:

CPU    0: hi:   18, btch:   3 usd:   0

Active_anon:3321 active_file:194 inactive_anon:3324

inactive_file:2449 unevictable:173 dirty:0 writeback:0 unstable:0

free:4348 slab:929 mapped:1186 pagetables:115 bounce:0

Normal free:17392kB min:1016kB low:1268kB high:1524kB active_anon:13284kB inactive_anon:13296kB active_file:776kB inactive_file:9796kB unevictable:692kB present:65024kB pages_scanned:0 all_unreclaimable? no

lowmem_reserve[]: 0 0

Normal: 418*4kB 1251*8kB 347*16kB 3*32kB 1*64kB 0*128kB 0*256kB 0*512kB 0*1024kB 0*2048kB 0*4096kB = 17392kB

2876 total pagecache pages

16384 pages of RAM

4485 free pages

1097 reserved pages

929 slab pages

1401 pages shared

0 pages swap cached

最佳答案

这里适当的处理可能是软件设计。您尝试通过本地数据报套接字发送 88kb 数据包是否有原因?对于这种大小的数据,流套接字似乎是更合适的选择(我猜这很可能在另一端按顺序解析)。对于非常小的传输,流开销是可以测量的,但在进程之间复制这么多数据时肯定不是。

关于c - sendto 失败 UNIX 域套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13125702/

相关文章:

c - 警告 : parameter names (without types) in function declaration

c - 如何创建一个程序,能够从用户处获取最多 1000 位的两个数字,然后打印结果?

c - 使用 size_t uint32 uint64 等的动机

linux - lib32-ncurses 没有安装到 rootfs

c - C 中基本基数特里树的实现

python - 使用 Python 从 linux 命令行读取

linux - 我可以修改特定进程的标准输入描述符吗?

c - 如何使用 ICMP 获取地址掩码

linux - 在 linux 内核 (4.9) 中移植时钟时出现问题

linux-kernel - 用内核触发用户空间