linux에서 disk io를 하는 방법 중 하나 pwrite

kyungminLim·2024년 5월 31일
0

About 'pwrite' function

'pwrite'는 POSIX 표준 함수로, file descriptor를 통해 파일에 데이터를 쓰는 데 사용된다. 'pwrite'는 'write'와 비슷하지만, 'pwrite'는 file offset을 지정할 수 있다는 점에서 다르다. 이는 원자적으로 수행되기 때문에, 다른 thread나 process가 file의 file offset을 변경하지 않는다.

'pwrite' 함수 정의

#include <unistd.h>
ssize_t pwrite(int fd, const void *buf, size_t count, off_t offset);
  • 'fd' : file descriptor이다. 'open' 함수 등을 사용해서 얻을 수 있다.
  • 'buf' : file에 쓸 데이터를 포함하는 buffer이다.
  • 'count' : buffer에서 file로 쓸 데이터의 byte 수이다.
  • 'offset' : file 내에서 data를 쓸 위치를 나타내는 offset이다.

return 값은 성공 시, 'pwrite'는 file에 실제로 쓰여진 byte 수를 반환한다. 실패 시, -1을 반환하며, 'errno'를 통해 오류의 원인을 알 수 있다.

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

int main() {
    int fd = open("example.txt", O_WRONLY | O_CREAT, 0644);
    if (fd < 0) {
        perror("Failed to open file");
        return 1;
    }

    const char *data = "Hello, World!";
    size_t data_size = 13; // Length of "Hello, World!"

    // Write data to the file at offset 0
    if (pwrite(fd, data, data_size, 0) != data_size) {
        perror("Failed to write data");
        close(fd);
        return 1;
    }

    close(fd);
    return 0;
}

'pwrite'를 사용하는 이유는 다음과 같다.

  1. 원자적 파일 쓰기 :
  • 'pwrite'는 file의 특정 위치에 데이터를 원자적으로 쓸 수 있게 한다. 이는 multi-threading or multi-process 환경에서 유용하다.
  1. file offset 유지 :
  • 'write' 함수는 file의 현재 offset을 사용하여 데이터를 슨다. 여러 thread 나 process가 동일한 file descriptor를 사용하는 경우, file의 현재 offset이 변경될 수 있다. 그러나 'pwrite'는 file의 offset을 변경하지 않으므로, 이 문제를 방지할 수 있다.
  1. Random Access :
  • file의 특정 위치에 데이터를 쓰는 데 유용하다. 예를 들어, database file이나 log file에서 특정 레코드를 업데이트하는 데 사용할 수 있다.

요약

'pwrite' 함수는 파일의 특정 오프셋에 데이터를 쓰는 데 사용되는 유용한 함수이다. 특히, multi thread, multi processor 환경에서 원자적 쓰기를 보장하고, 파일의 현재 오프셋을 변경하지 않기 때문에 안정적인 random access를 제공한다.

0개의 댓글