c - 内部由管道连接的具有父/子进程的迭代器未正确递增
问题描述
非常简单的大学代码(操作系统类),使父进程从字符串中读取,然后子进程写入字符串,同时使用管道。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
int main(int argc, char* argv[])
{
int nDadosTx, nDadosRx;
int size = 2;
const char textoTX[] = "roger roger!";
char textoRX[sizeof(textoTX)];
int fd[size][2];
int i = 0;
while (i < size)
{
if (pipe(fd[i]) < 0)
{
puts("Erro ao abrir os pipes.\n");
exit(-1);
}
if (fork() == 0)
{
close(fd[i][0]);
nDadosTx = write(fd[i][1], textoTX, strlen(textoTX)+1);
if (nDadosTx != strlen(textoTX)+1)
{
printf("Tamanhos da mensagem incompativeis: %d, %d.\n", nDadosTx, strlen(textoTX)+1);
exit(1);
}
printf("%d dados escritos\n", nDadosTx);
printf("Droid %d a postos.\n------\n", i);
}
else
{
close(fd[i][1]);
nDadosRx = read(fd[i][0], textoRX, sizeof(textoRX));
printf("%d dados lidos: %s\n", nDadosRx, textoRX);
}
waitpid(-1, NULL, 0);
i++;
}
/*for (int i = 0; i < 6; i++)
{
close (fd[0]);
close (fd[1]);
}*/
return 0;
}
如果程序只执行 1 次,但添加迭代:
2 次迭代:
i = 0
正常打印
i = 1
正常打印
i = 1
正常打印
(是的,再次)
3 次迭代:
i = 0
正常打印
i = 1
正常打印
i = 2
正常打印
i = 2
正常打印
i = 1
正常打印
i = 2
正常打印
i = 2
正常打印
这是怎么回事?
GCC 10.1.0
解决方案
“一个问题是子进程也在运行只有父进程才能运行的代码——例如,子进程也调用 waitpid,然后在下一次迭代中分叉。子代码路径应该在此之前退出或返回。——@kaylum 5 分钟前"
#include <sys/types.h>
退出(EXIT_SUCCESS);到底孩子做到了。
推荐阅读
- c++ - 从 C 样式数组初始化 STL 数组的最佳方法是什么?
- python - 如何将我的扭曲聊天链接到我的 github 网站?
- java - 读取 micronaut 方面的占位符
- c# - C# int 和仅包含 int 的结构之间的实际和理论差异
- python-3.x - 如何在 Python Pandas 的列中显示重复值的范围?
- linux - 在 docker run 中导出变量列表
- python - 如何查找 VALUE 列中有多少 TRUE 或 FALSE
- python - 使用 docker 和 cloud run 部署 dbt 的正确方法
- python - 将数据框列表示为其他列的线性组合
- video - 如何使用 gst-launch (gstreamer) 将 .mp4 文件转换为不丢失帧的 .yuv (raw video i420)?