write

AI
qwen-3-235b-a22b-instruct-2507
작성자
익명
작성일
2025.10.11
조회수
11
버전
v1

write

개요

write유닉스(Unix) 및 유닉스 계 운영체제(: 리눅스, macOS)에서 제공하는 시스템 콜(system call)로, 파일 디스크터(file descriptor)를 통해 데이터를 출력 장치 또는 파일에 쓰는 데 사용된다. 이 함수는 C 언어 프로그래밍에서 시스 레벨의 입출력(I/O) 작업을 수행할 때 핵심적인 역할을 하며, 특히 표준 출력(stdout), 파일, 소켓 등 다양한 I/O 대상에 데이터를 전송하는 데 활용된다.

write버퍼링되지 않는(unbuffered) 저수준 I/O 함수로, 표준 C 라이브러리의 [fwrite](/doc/%EA%B8%B0%EC%88%A0/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D/C%20%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC/fwrite), [printf](/doc/%EA%B8%B0%EC%88%A0/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D/C%20%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC/printf) 등과는 달리 운영체제 커널과 직접 상호작용한다. 따라서 성능과 제어력 측면에서 유리하지만, 프로그래머가 오류 처리와 상태 관리를 직접 책임져야 한다.


함수 원형

write 시스템 콜의 C 언어에서의 원형은 다음과 같다:

#include <unistd.h>

ssize_t write(int fd, const void *buf, size_t count);

매개변수 설명

매개변수 설명
fd 데이터를 쓸 대상의 파일 디스크립터. 예: 1은 표준 출력, 2표준 에러.
buf 쓰려는 데이터가 저장된 메모리 버퍼의 주소.
count buf에서 쓰려는 바이트 수.

반환값

  • 성공 시: 실제로 쓰여진 바이트 수 (0 이상). 이 값은 요청한 count보다 작을 수 있음.
  • 실패 시: -1을 반환하며, 전역 변수 [errno](/doc/%EA%B8%B0%EC%88%A0/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D/C%20%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC/errno)에 오류 코드가 설정됨.

🔔 주의: write완전히 요청한 데이터를 쓰지 못할 수도 있다. 예를 들어, 파이프의 버퍼가 가득 찼거나 네트워크 연결이 일시적으로 제한된 경우 일부 데이터만 전송될 수 있다. 따라서 실제 프로그래밍에서는 반환값을 반드시 검사하고, 필요한 경우 재시도 로직을 구현해야 한다.


사용 예제

1. 표준 출력에 문자열 쓰기

#include <unistd.h>

int main() {
    const char *msg = "Hello, World!\n";
    write(1, msg, 14);  // 1: 표준 출력
    return 0;
}

이 예제는 "Hello, World!"를 화면에 출력한다. printf와 유사하지만, write는 포맷팅 기능이 없고 순수한 바이트 전송만 수행한다.

2. 파일에 데이터 쓰기

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

int main() {
    int fd = open("output.txt", O_WRONLY | O_CREAT | O_TRUNC, 0644);
    if (fd == -1) {
        // 오류 처리
        return 1;
    }

    const char *data = "This is a test.";
    write(fd, data, 15);

    close(fd);
    return 0;
}

이 코드는 output.txt라는 파일을 생성하거나 열고, 문자열을 쓴 후 파일을 닫는다.


주요 특징

비버퍼링 I/O

write버퍼링되지 않는 입출력을 수행하므로, 호출 시 즉시 커널로 데이터가 전달된다. 이는 stdio.hfprintffwrite와의 주요 차이점이며, 성능 최적화를 위해 버퍼링을 직접 제어해야 할 때 유리하다.

원자성 보장 (일부 경우)

리눅스에서 write작은 크기의 데이터(일반적으로 [PIPE_BUF](/doc/%EA%B8%B0%EC%88%A0/%EC%8B%9C%EC%8A%A4%ED%85%9C%20%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D/%ED%8C%8C%EC%9D%B4%ED%94%84/PIPE_BUF) 바이트 이하, 보통 4KB)를 파이프나 FIFO에 쓸 때 원자적(atomic)으로 동작한다. 즉, 여러 프로세스가 동시에 쓰더라도 데이터가 섞이지 않고 하나의 블록으로 처리된다.

비차단 모드 지원

파일 디스크립터가 비차단(non-blocking) 모드로 설정된 경우, write는 즉시 반환될 수 있으며, 데이터를 일부만 쓸 수 있다. 네트워크 프로그래밍에서 이는 매우 중요한 고려사항이다.


오류 코드 (errno)

write-1을 반환할 경우, 다음 errno 값이 설정될 수 있다:

errno 설명
[EBADF](/doc/%EA%B8%B0%EC%88%A0/%EC%8B%9C%EC%8A%A4%ED%85%9C%20%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D/%EC%98%A4%EB%A5%98%20%EC%BD%94%EB%93%9C/EBADF) 유효하지 않은 파일 디스크립터
[EPIPE](/doc/%EA%B8%B0%EC%88%A0/%EC%8B%9C%EC%8A%A4%ED%85%9C%20%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D/%EC%98%A4%EB%A5%98%20%EC%BD%94%EB%93%9C/EPIPE) 파이프 또는 소켓이 닫혀 있어 더 이상 쓸 수 없음 (SIGPIPE도 발생 가능)
[EFAULT](/doc/%EA%B8%B0%EC%88%A0/%EC%8B%9C%EC%8A%A4%ED%85%9C%20%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D/%EC%98%A4%EB%A5%98%20%EC%BD%94%EB%93%9C/EFAULT) buf가 유효한 사용자 메모리 영역을 가리키지 않음
[EINTR](/doc/%EA%B8%B0%EC%88%A0/%EC%8B%9C%EC%8A%A4%ED%85%9C%20%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D/%EC%98%A4%EB%A5%98%20%EC%BD%94%EB%93%9C/EINTR) 시스템 콜이 신호에 의해 중단됨 (인터럽트)
[ENOMEM](/doc/%EA%B8%B0%EC%88%A0/%EC%8B%9C%EC%8A%A4%ED%85%9C%20%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D/%EC%98%A4%EB%A5%98%20%EC%BD%94%EB%93%9C/ENOMEM) 커널 메모리 부족

관련 함수 및 대조

함수 설명
[read](/doc/%EA%B8%B0%EC%88%A0/%EC%8B%9C%EC%8A%A4%ED%85%9C%20%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D/%EC%8B%9C%EC%8A%A4%ED%85%9C%20%EC%BD%9C/read)() 입력을 위한 대응 시스템 콜
fwrite() 버퍼링된 C 라이브러리 함수
[send](/doc/%EA%B8%B0%EC%88%A0/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC%20%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D/send)() 소켓 전용 데이터 전송 (TCP/UDP)
printf() 포맷팅 출력을 지원하는 고수준 함수

write는 저수준이지만 유연하고 빠르며, 운영체제와의 직접적인 인터페이스를 제공하므로 시스템 프로그래밍, 임베디드 시스템, 네트워크 서버 등에서 널리 사용된다.


참고 자료

📌 Tip: write는 신뢰할 수 있는 I/O를 위해 반환값을 항상 검사하고, 부분 쓰기(partial write) 시 나머지를 다시 쓰는 루프를 구현하는 것이 권장된다.

AI 생성 콘텐츠 안내

이 문서는 AI 모델(qwen-3-235b-a22b-instruct-2507)에 의해 생성된 콘텐츠입니다.

주의사항: AI가 생성한 내용은 부정확하거나 편향된 정보를 포함할 수 있습니다. 중요한 결정을 내리기 전에 반드시 신뢰할 수 있는 출처를 통해 정보를 확인하시기 바랍니다.

이 AI 생성 콘텐츠가 도움이 되었나요?