Array of Pipe: Будет ли родительский процесс загружать массив достаточно быстро? - PullRequest
0 голосов
/ 18 марта 2019
    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} ... такого рода вещи?

1 Ответ

1 голос
/ 18 марта 2019

Это не работает.

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

Теперь это работает.

...