Linux编程之posix标准中文件操作API和内存管理API的使用办法

一、POSIX 文件操作 API

文件操作API用于与文件系统交互,如打开文件、读取数据、写入数据等。常见的文件操作API包括 open()read()write()close()lseek()stat() 等。

1. open(): 打开文件

#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>

int open(const char *pathname, int flags, mode_t mode);
  • pathname: 文件路径
  • flags: 打开方式,可以是以下选项之一:
    • O_RDONLY: 只读
    • O_WRONLY: 只写
    • O_RDWR: 读写
    • O_CREAT: 文件不存在则创建
    • O_TRUNC: 如果文件已存在,清空文件内容
  • mode: 如果使用 O_CREAT 标志时,设置文件的权限(例如 0644,表示文件权限为用户可读写,其他组可读)
示例:
int fd = open("example.txt", O_CREAT | O_WRONLY, 0644);
if (fd == -1) {
    perror("open");
    return -1;
}

2. read(): 读取文件

#include <unistd.h>

ssize_t read(int fd, void *buf, size_t count);
  • fd: 文件描述符
  • buf: 存储读取数据的缓冲区
  • count: 要读取的字节数
示例:
char buffer[100];
ssize_t bytesRead = read(fd, buffer, sizeof(buffer));
if (bytesRead == -1) {
    perror("read");
}

3. write(): 写入文件

#include <unistd.h>

ssize_t write(int fd, const void *buf, size_t count);
  • fd: 文件描述符
  • buf: 要写入数据的缓冲区
  • count: 要写入的字节数
示例:
const char *data = "Hello, POSIX!";
ssize_t bytesWritten = write(fd, data, strlen(data));
if (bytesWritten == -1) {
    perror("write");
}

4. close(): 关闭文件

#include <unistd.h>

int close(int fd);
  • fd: 文件描述符
示例:
if (close(fd) == -1) {
    perror("close");
}

5. lseek(): 文件指针偏移

#include <unistd.h>

off_t lseek(int fd, off_t offset, int whence);
  • fd: 文件描述符
  • offset: 偏移量
  • whence: 偏移方式
    • SEEK_SET: 从文件头开始偏移
    • SEEK_CUR: 从当前位置偏移
    • SEEK_END: 从文件尾偏移
示例:
off_t newPos = lseek(fd, 0, SEEK_END); // 将文件指针移动到文件末尾
if (newPos == -1) {
    perror("lseek");
}

6. stat(): 获取文件状态

#include <sys/stat.h>
#include <unistd.h>

int stat(const char *pathname, struct stat *statbuf);
  • pathname: 文件路径
  • statbuf: 用于保存文件状态的结构体
示例:
struct stat fileStat;
if (stat("example.txt", &fileStat) == -1) {
    perror("stat");
} else {
    printf("File size: %ld\n", fileStat.st_size);
}

下面是一个使用POSIX标准API编写的文件读写例程

包括 open()read()write()lseek()stat()close() 等。

代码示例

#include <fcntl.h>    // open
#include <unistd.h>   // read, write, close, lseek
#include <sys/stat.h> // stat
#include <stdio.h>    // printf, perror
#include <string.h>   // strlen

int main() {
    int fd;
    struct stat fileStat;
    char buffer[128];
    ssize_t bytesRead, bytesWritten;

    // 1. 使用 open() 打开文件,若文件不存在则创建
    fd = open("example.txt", O_CREAT | O_RDWR, 0644);
    if (fd == -1) {
        perror("open");
        return -1;
    }

    // 2. 使用 write() 向文件写入数据
    const char *data = "Hello, POSIX file operations!";
    bytesWritten = write(fd, data, strlen(data));
    if (bytesWritten == -1) {
        perror("write");
        close(fd);
        return -1;
    }

    printf("Wrote %zd bytes to file.\n", bytesWritten);

    // 3. 使用 lseek() 将文件指针移回文件开头
    if (lseek(fd, 0, SEEK_SET) == -1) {
        perror("lseek");
        close(fd);
        return -1;
    }

    // 4. 使用 read() 从文件中读取数据
    bytesRead = read(fd, buffer, sizeof(buffer) - 1);
    if (bytesRead == -1) {
        perror("read");
        close(fd);
        return -1;
    }
    buffer[bytesRead] = '\0'; // Null-terminate the string

    printf("Read %zd bytes: %s\n", bytesRead, buffer);

    // 5. 使用 stat() 获取文件信息
    if (stat("example.txt", &fileStat) == -1) {
        perror("stat");
        close(fd);
        return -1;
    }

    printf("File size: %ld bytes\n", fileStat.st_size);

    // 6. 关闭文件
    if (close(fd) == -1) {
        perror("close");
        return -1;
    }

    return 0;
}

代码说明

  1. open():打开或创建名为 example.txt 的文件,并以读写模式打开。
  2. write():将字符串 “Hello, POSIX file operations!” 写入文件。
  3. lseek():将文件指针移到文件开头。
  4. read():从文件中读取内容并将其打印到控制台。
  5. stat():获取文件的状态信息,如文件大小。
  6. close():关闭文件。

编译步骤

  1. 将上述代码保存到文件 file_io_example.c 中。
  2. 使用 GCC 编译器在 Linux 环境中编译该程序:
gcc file_io_example.c -o file_io_example

运行步骤

  1. 编译成功后,运行程序:
./file_io_example

运行结果

当程序执行时,它会创建或打开一个名为 example.txt 的文件,写入一段文本,然后读取并显示该文本,最后打印文件的大小。

Wrote 30 bytes to file.
Read 30 bytes: Hello, POSIX file operations!
File size: 30 bytes

文件 example.txt 内容

Hello, POSIX file operations!

这个例程展示了如何使用 POSIX 文件操作 API 执行文件的读写操作,并通过 lseek()stat() 对文件进行操作和查询。它展示了从打开文件、写入数据、读取数据、获取文件状态到关闭文件的完整流程。在 Linux 环境下,你可以通过简单的编译和运行步骤测试这些 API 的实际使用效果。

二、POSIX 内存管理 API

内存管理API主要用于动态内存分配和管理,常见的API包括 malloc()free()mmap()munmap() 等。

1. malloc(): 动态内存分配

#include <stdlib.h>

void *malloc(size_t size);
  • size: 要分配的内存大小(以字节为单位)
  • 返回值为指向分配内存的指针,失败时返回 NULL
示例:
int *arr = (int *)malloc(10 * sizeof(int));
if (arr == NULL) {
    perror("malloc");
}

2. free(): 释放内存

#include <stdlib.h>

void free(void *ptr);
  • ptr: 要释放的内存指针(必须是通过 malloc()calloc() 分配的内存)
示例:
free(arr); // 释放之前通过 malloc 分配的内存

3. mmap(): 内存映射文件到进程地址空间

#include <sys/mman.h>
#include <fcntl.h>

void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);
  • addr: 内存起始地址(通常为 NULL,由系统决定)
  • length: 映射的大小
  • prot: 映射区域的保护方式,如:
    • PROT_READ: 可读
    • PROT_WRITE: 可写
  • flags: 映射的类型,如:
    • MAP_SHARED: 共享映射
    • MAP_PRIVATE: 私有映射
  • fd: 打开的文件描述符
  • offset: 文件的偏移量
示例:
int fd = open("example.txt", O_RDONLY);
if (fd == -1) {
    perror("open");
}

void *mapped = mmap(NULL, 4096, PROT_READ, MAP_PRIVATE, fd, 0);
if (mapped == MAP_FAILED) {
    perror("mmap");
}
close(fd);

4. munmap(): 解除内存映射

#include <sys/mman.h>

int munmap(void *addr, size_t length);
  • addr: 映射的起始地址
  • length: 映射的长度
示例:
if (munmap(mapped, 4096) == -1) {
    perror("munmap");
}

以下是一个简单的内存管理程序示例,使用 POSIX 标准 API:

程序代码

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/mman.h>

#define SIZE 1024  // 1 KB

int main() {
    // 使用 mmap 分配内存
    void *addr = mmap(NULL, SIZE, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
    if (addr == MAP_FAILED) {
        perror("mmap");
        return 1;
    }

    // 写入数据
    snprintf((char *)addr, SIZE, "Hello, POSIX memory management!");

    // 打印数据
    printf("Data: %s\n", (char *)addr);

    // 解除映射
    if (munmap(addr, SIZE) == -1) {
        perror("munmap");
        return 1;
    }

    return 0;
}

编译与运行步骤

  1. 保存代码为 memory_management.c
  2. 使用 gcc 编译代码:
    gcc -o memory_management memory_management.c
    
  3. 运行生成的程序:
    ./memory_management
    

运行结果

Data: Hello, POSIX memory management!

这个程序使用 mmap 函数分配了 1 KB 的内存,写入了一些数据,然后打印出来,最后解除内存映射。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值