首页 > 解决方案 > 管道数组:父进程加载数组的速度是否足够快?

问题描述

    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} 之类的东西......那种东西?

标签: clinuxpipe

解决方案


这不起作用。

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){

现在它起作用了。


推荐阅读