ZBLOG

Linux下多线程使用标准库中的lseek + read系统调用读取同一个文件示例

在Linux下,你可以使用标准库中的lseekread系统调用来实现多线程读取同一个文件。下面是一个示例代码:

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <fcntl.h>
#include <unistd.h>

#define BUFFER_SIZE 1024

int fileDescriptor;
pthread_mutex_t mutex;

void* readFromFile(void* arg)
{
    char buffer[BUFFER_SIZE];
    ssize_t bytesRead;

    while (1) {
        off_t offset;
        
        // 加锁
        pthread_mutex_lock(&mutex);
        
        // 使用lseek获取当前线程要读取的文件位置偏移量
        offset = lseek(fileDescriptor, 0, SEEK_CUR);

        // 使用read系统调用读取文件内容
        bytesRead = read(fileDescriptor, buffer, BUFFER_SIZE);
        
        // 解锁
        pthread_mutex_unlock(&mutex);
        
        if (bytesRead == -1) {
            perror("read");
            break;
        }
        
        // 判断是否已经到达文件末尾
        if (bytesRead == 0)
            break;

        printf("Thread %lu reads from offset %ld:\n", pthread_self(), offset);
      
        // 在控制台上打印输出
       write(STDOUT_FILENO, buffer, bytesRead);
    }

    return NULL;
}

int main()
{
    const char* filename = "example.txt";
    const int numThreads = 4;

    // 打开文件
    fileDescriptor = open(filename, O_RDONLY);
    if (fileDescriptor == -1) {
      perror("open");
      exit(EXIT_FAILURE);
   }

     // 创建线程数组
     pthread_t threads[numThreads];

     // 初始化互斥锁
     pthread_mutex_init(&mutex, NULL);
     
     for (int i = 0; i < numThreads; ++i) {
         pthread_create(&threads[i], NULL, readFromFile, NULL);
     }

     // 等待所有线程结束
     for (int i = 0; i < numThreads; ++i) {
         pthread_join(threads[i], NULL);
     }
     
    // 关闭文件描述符
    close(fileDescriptor);

    // 销毁互斥锁
    pthread_mutex_destroy(&mutex);

    return 0;
}

该示例程序创建了4个线程,并发地从同一个文件中读取数据。每个线程通过调用lseekread系统调用来读取文件内容,并在控制台上打印输出。

在每次要读取文件之前,线程会先获取互斥锁,然后使用lseek获取当前线程要读取的文件位置偏移量,接着使用read系统调用来读取文件内容。完成后释放互斥锁。

请注意,在实际应用中,你可能需要根据具体需求对代码进行适当的错误处理和优化。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://sdn.0voice.com/?id=3858

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?