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
相关产品推荐
相关产品推荐

