C: Pipe: Как правильно передать массив Dynami c int с помощью pipe - PullRequest
0 голосов
/ 28 мая 2020

Я попытался записать динамический c выделенный массив int в нескольких дочерних процессах и прочитать их в родительском процессе с помощью канала, но результат такой: [-15236548, 37526, -15236548, 37526,0,0,0 , 0,0,0], похоже, адреса читаются вместо реальных значений [1,1,1,1,0,2,1,1,1,1]. Я действительно борюсь с этим весь день, любая помощь будет принята с благодарностью !!!

Дочерний процесс - 10, они сначала будут писать массив каждый, а после того, как все они будут выполнены, родительский процесс читает массив 10.

int *getArr(){
    int * arr1 = malloc(sizeof(int) *100);
    //do something
    return arr1;
}

//write values to pipe
void write_check(int fd, void *buffer, size_t len){
    char *p = buffer;
    while(len>0){
        size_t wlen = write(fd, p, len);
        if(wlen <= 0)
            exit(0);
        p += wlen;
        len -= wlen;
    }
}

// read values from pipe
void read_check(int fd, void *buffer, size_t len){
    char *p = buffer;
    while(len>0){
        size_t rlen = read(fd, p, len);
        if(rlen <= 0)
            exit(0);
        p += rlen;
        len -= rlen;
    }
}

// pass values, and get it ready to be wrote
void write_ints(int fd, int *p, int len){
    write_check(fd, p, len * sizeof(*p));
}

// allocate memory for fetching values
void read_ints(int fd, int *p, int len){
    p = malloc(len * sizeof(*p));
    read_check(fd, p, len* sizeof(*p));
}


int main(){
    int len = 100;
    int *arr1 = malloc(sizeof(int) * 100);
    int *fds = malloc(sizeof(int) * 10 * 2);

    // child processes write values to pipe
    for(int i=0; i<10; i++){
        child_pid = fork();
        if (child_pid == 0){
            // do something
            arr1 = getArr();
            write_ints(fd[i*2+1], &arr1, len);
        }
    }
    // parent process reads values 
    for(int i=0; i<10; i++){
        // do something
        read_ints(fd[i*2], &arr1, len);
    }
}

Ответы [ 2 ]

1 голос
/ 28 мая 2020
void read_ints(int fd, int *p, int len){
    p = malloc(len * sizeof(*p));
    read_check(fd, p, len* sizeof(*p));
}

Эта функция не работает. Вы передаете ему указатель, который он игнорирует. Затем он выделяет некоторую память, считывает некоторые целые числа в эту память и ничего не делает с указателем на эту память, не оставляя вызывающей стороне возможности получить доступ к считанным значениям.

Если эта функция собирается выделить память, ей необходимо чтобы вернуть указатель на выделенную им память. Если эта функция собирается получить указатель на память, в которую она будет читать целые числа, тогда она должна считывать целые числа в предоставленный буфер, а не выделять свой собственный.

Ваш код будет намного проще отлаживать если бы у него были комментарии. Глядя на эту функцию, я не могу сказать, что она должна делать, и вижу противоречивую информацию в коде. Предполагается ли выделить буфер для чтения целых чисел или ему должен быть предоставлен указатель на буфер для чтения? Комментарий прояснил бы это.

Вы пока не можете рассчитывать на свой код, чтобы задокументировать ваши намерения, потому что ваш код еще недостаточно хорош для этого. Поэтому вам нужно использовать комментарии, чтобы другие люди могли сказать, что вы собираетесь делать, а не только то, что вы на самом деле сделали.

0 голосов
/ 28 мая 2020

ожидается int *, но аргумент - int ** ошибка из-за передачи & arr1. Адрес указателя - двойной указатель. Просто передайте arr1 (как в write_ints, так и в read_ints), и вы не получите эту ошибку.

...