Member 13849940 Ответов: 3

Многопоточность для чтения/записи файла


Здравствуйте, как два потока создания буксировки для записи и чтения в одном файле (на языке Си)
любой совет, пожалуйста.....:)

Что я уже пробовал:

??????????????????????????????????????????

3 Ответов

Рейтинг:
0

Rick York

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


Рейтинг:
0

Jochen Arndt

Вы должны использовать какой-то механизм блокировки для файла (см. Блокировка файлов в Linux[^]), или - когда потоки принадлежат одному и тому же процессу и у вас есть общий файловый дескриптор / дескриптор - блоки кода, которые записываются в файл.

Если потоки принадлежат одному и тому же процессу, я бы использовал общий файловый дескриптор и механизмы блокировки используемого типа потока, такие как pthread_mutex_lock(3): блокировка/разблокировка мьютекса - Man-страница Linux[^] с pthread.


Рейтинг:
0

User 6901758

Это всего лишь пример чтения/записи с синхронизацией с использованием блокировок файлов. Там нет никаких проверок ошибок или чего-то подобного.

#include <unistd.h>
#include <sys/file.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <pthread.h>
#include <stdio.h>
#include <string.h>

int fd;
off_t read_offset;
int q = 0;

void* reader_routine(void* p)
{
    char buffer[32] = {0};
    int bytesRead = 0;

    while(!q)
    {
        flock(fd, LOCK_EX);
        lseek(fd, read_offset, SEEK_SET);
        bytesRead = read(fd, buffer, 32);
        flock(fd, LOCK_UN);
        if (bytesRead > 0)
        {
            read_offset = lseek(fd, read_offset + bytesRead, SEEK_SET);
            buffer[bytesRead] = 0;
            puts(buffer);
        }
    }

    lseek(fd, read_offset, SEEK_SET);
    bytesRead = read(fd, buffer, 32);
    if (bytesRead > 0)
    {
        buffer[bytesRead] = 0;
        puts(buffer);
    }
    return NULL;
}

int main()
{
    pthread_t th;
    const char* const numbers[] = { "one", "two", "three", "four", "five" };
    fd = open("file.txt", O_RDWR | O_CREAT | O_TRUNC, S_IRWXU | S_IRWXG);
    srand(time(NULL));

    read_offset = lseek(fd, SEEK_SET, 0);
    pthread_create(&th, NULL, reader_routine, NULL);
    for(int i = 0; i < 5; ++i)
    {
        flock(fd, LOCK_EX);
        sleep(rand()%5);
        lseek(fd, 0, SEEK_END);
        write(fd, numbers[i], strlen(numbers[i]));
        flock(fd, LOCK_UN);
    }
    q = 1;
    pthread_join(th, NULL);
    close(fd);
}