c - 管道数组:父进程加载数组的速度是否足够快?
问题描述
for (int i = 0; i < number_processes; i++){
while (read(fps[i][0], &each_record_read, sizeof(struct rec)) > 0){
if (records_container[i] == NULL){
records_container[i] = &each_record_read;
}
} // I want to do something to records_container here.
}
我有一个程序,其目的是让父进程从连接到多个子进程的每个管道中读取数据。
我已经定义了一个名为 records_container 的数组,其中包含我将从管道中读取的每种数据类型,并且我想在 while 循环之后对这个数组做一些事情。
我的问题是:当父级将数据加载到records_container这个数组时,父级加载速度是否足够快,以至于当我想对records_container做一些事情时,我总是可以确保所有数据都已经被完美加载?
假设在这种情况下 records_container 是 {0, 0, 0, 0} (我知道我想加载 struct rec,但这并不重要),我希望它发生的理想情况是我想处理使用加载的数组,在本例中为 {1, 2, 3, 4} ,父级将足够快地读取每个数字(在本例中为每个管道的 1, 2, 3, 4),这样我就不会处理像 {1, 2, 0, 0} 或 {1, 0, 0, 0} 之类的东西......那种东西?
解决方案
这不起作用。
while (read(fps[i][0], &each_record_read, sizeof(struct rec)) > 0)
是错误的,你可以得到一个简短的阅读。在处理结构化管道时,我们通常使用如下内容:
ssize_t read_block(int source, void *buffer, ssize_t len)
{
char *work = buffer;
while (len) {
ssize_t delta = read(source, work, len);
if (delta < 0) return -1; /* ERROR */
if (delta == 0) return 0; /* EOF */
work += delta;
len -= delta;
}
}
/* ... */
while (read_block(fps[i][0], &each_record_read, sizeof(struct rec)) > 0){
现在它起作用了。
推荐阅读
- neo4j - 使用 Couchbase 在 neo4j 中插入/更新文档
- sql - SELECT 语句中的多个条件
- python - 使用 pip 安装 keras 时出错?
- ssh - 我想知道我必须使用 ssh 登录终端的 ip
- git - `git remote add --mirror=fetch` 会与 `git clone --mirror` 生成相同的仓库吗?
- javascript - 以角度禁用另一个组件的表单字段
- javascript - Dropzone.js如何向上传的图像添加带有值的隐藏输入
- r - 使用 system() 打开带有 URL 参数的本地 index.html
- python - 如何将存储为数组的 Dataframe 值转换为列表
- python - AttributeError:模块“ocrmypdf”没有属性“ocr”