You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linux父子进程通过pipe传输不同大小数据执行时间异常排查

问题根因

你当前的代码根本没有通过管道传输实际的批量数据,仅传输了固定长度的指针值,这是耗时和数据量无关的核心原因。

1. 核心逻辑错误:未传输实际数据

你调用write的代码是:

write(pipeWrite, &data, sizeof(data));

这里data本身是指向堆上数据块的指针,&data是指针变量自身的内存地址,你实际写入管道的是指针变量的值(32位系统下4字节、64位系统下8字节),和指针指向的1KB~100MB的实际数据没有任何关系。无论你生成多大的数据块,写入管道的内容长度都是固定的,自然耗时不会随数据量增长。
同时父子进程的地址空间完全独立,就算子进程拿到了父进程的指针值,也无法访问父进程的堆内存,这种传指针的逻辑本身就是错误的。

2. 子进程循环逻辑错误

子进程的循环定义为:

for (int i = 0; i < 100001; i = i * 10)

初始值i=0,每次执行i = i *10后i始终为0,会进入死循环,你当前能拿到输出只是巧合。

3. 错误处理逻辑存在栈溢出风险

char message[] = "Error starting the pipe ";
strcat(message, (char*) &i);

message数组的长度仅为字符串常量的长度,没有预留拼接的额外空间,直接strcat会造成栈溢出,触发未定义行为。


修复思路

  • 传输数据时需要传入数据块的首地址、真实长度,正确写法为write(pipeWrite, data, 1024 * i),子进程对应读取对应长度的数据到自己的缓冲区
  • 修正子进程循环的初始值为1,和父进程保持一致
  • 修复错误处理的字符串拼接逻辑,预留足够的缓冲区空间

内容的提问来源于stack exchange,提问作者Gabriel Santana Paredes

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 18:48:05