WRITE(2)

명칭
write, writev, pwrite - 출력의 기록

프로그램 라이브러리
libc

서식
<sys/types.h> <sys/uio.h> <unistd.h> ssize_t write(int d, const void *buf, size_t nbytes) ssize_t writev(int d, const struct iovec *iov, int iovcnt) ssize_t pwrite(int d, const void *buf, size_t nbytes, off_t offset)

해설
write() (은)는, buf 하지만 가리키는 버퍼로부터 기술자 d 하지만 참조하는 오브젝트에 nbytes 의 데이터를 쓰기 이제(벌써)로 합니다. writev() (은)는 같은 동작을 합니다만, iov[0], iov[1], ..., iov[iovcnt-1] 라고 한다 iov 배열의 멤버가 지정한다 iovcnt 버퍼로부터 출력 데이터를 모읍니다. pwrite() (은)는 같은 기능을 실행합니다만, 파일 포인터를 수정하지 않고 , 파일의 특정 장소에 기록.

writev() 그럼, iovec 구조체가 이하와 같이 정의되고 있습니다.

    struct iovec {
    	char   *iov_base;    /* 베이스 주소 */
    	size_t  iov_len;     /* 길이 */
    };

각 iovec 엔트리는, 쓰기데이터가 있는 메모리의 베이스 주소와 area의 길이를 지정합니다. writev() (은)는, 항상 area 전체를 쓰기 그리고로부터 다음에 진행됩니다.

시크 기능이 있는 오브젝트에서는, write() 하 d 에 관련하는 포인터가 지정하는 위치에서 개시합니다. lseek(2) (을)를 참조해 주세요. write() (으)로부터 돌아오면(자), 포인터는 쓰기바이트수만큼 진행됩니다.

시크 기능이 없는 오브젝트에서는, 항상 현재 위치로부터 기록. 이러한 오브젝트에 관련하는 포인터의 값은 미정도리입니다.

열매 유저가 슈퍼 유저가 아닌 경우, write() (은)는, set-user-ID 비트를 파일로 클리어 합니다. 이것에 의해, 슈퍼 유저가 소유하는 기록 가능한 set-user-ID 파일을 「잡았다」유저는, system security를 돌파할 수 없게 됩니다.

소켓과 같이, 플로우(flow) 컨트롤의 영향을 받는 오브젝트로 비블로킹 I/O 를 사용하면(자), write() (와)과 writev() (은)는, 요구했던 것보다 적은 바이트수를 쓰기일이 있습니다. 반환값에 주의해, 가능한 경우에는 오퍼레이션의 나머지를 재차 시험해 주세요.

반환값
처리가 정상적으로 완료하면(자), 쓰기바이트수가 돌려주어집니다. 그렇지 않은 경우는 -1 이 돌려주어져 에러를 나타내기 위해서(때문에) 글로벌 변수 errno 하지만 설정됩니다.

에러
write(), writev(), pwrite() (은)는, 이하의 경우에 에러가 되어, 파일 포인터는 변경되지 않고 남습니다.

[EBADF]
    d 하지만, 기록용으로 열린 유효한 기술자가 아닙니다.

[EPIPE]
    프로세스에 의한 읽기용으로 열리지 않은 파이프에 쓰기 이제(벌써)로 했습니다.

[EPIPE]
    통신 상대의 소켓에 접속하고 있지 않는 타입 SOCK_STREAM 의 소켓에 쓰기 이제(벌써)로 했습니다.

[EFBIG]
    프로세스의 파일 사이즈 제한이나 최대 파일 사이즈를 넘은 파일에 쓰기 이제(벌써)로 했습니다.

[EFAULT]
    iov 의 일부, 또는 파일에 쓰기데이터는, 프로세스에 할당할 수 있었던 address 공간의 범위외를 가리키고 있습니다.

[EINVAL]
    d 에 관련하는 포인터가 부가 되어 있습니다.

[ENOSPC]
    파일을 포함한 파일 시스템에, 충분한 스페이스가 남아 있지 않습니다.

[EDQUOT]
    파일을 포함한 파일 시스템의 유저의 디스크 블록 할당량이 쓰여지고 있습니다.

[EIO]
    파일 시스템에 읽고 쓰기하고 있는 동안에 입출력 에러가 발생했습니다.

[EINTR]
    기록이 완료하기 전에 시그널이 끼어들었습니다.

[EAGAIN]
    파일은 비블로킹 입출력의 표가 붙은 상태로, 게다가, 곧바로 데이터를 쓰기상태가 아닙니다.

writev() (은)는, 이하의 에러를 되돌리는 일이 있습니다.

[EDESTADDRREQ]
    connect(2) (을)를 사용해 기록처 주소를 설정했다 UNIX 도메인 데이터 그램 소켓에 쓰기경우에, 기록처를 사용할 수 없습니다.

[EINVAL]
    iovcnt 하지만 0 이하가 되어 있는지, UIO_MAXIOV 보다 , 커지고 있습니다.

[EINVAL]
    iov 배열 iov_len 값의 1 개가 부가 되어 있습니다.

[EINVAL]
    iov 배열 iov_len 값의 합계가, 32 비트 정수를 오버플로우 했습니다.

[ENOBUFS]
    소켓에 써내고 있을 때에 mbuf 의 풀을 쓰여졌습니다.

pwrite() 호출은, 이하의 에러를 되돌리는 일이 있습니다.

[EINVAL]
    지정한 파일 오프셋(offset)가 올바르지는 않습니다.

[ESPIPE]
    파일 기술자가, 파이프, 소켓, FIFO 에 관련하고 있습니다.

관련 항목
fcntl(2), lseek(2), open(2), pipe(2), select(2)

표준
write() 함수 호출은, p1003.1-90 에 준거하고 있습니다. writev() 함수와 pwrite() 함수는, xpg4. 2 그리고 등장했습니다.

역사
pwrite() 함수 호출은, AT&T UNIX 4 그리고 등장했습니다. writev() 함수 호출은, 4.2BSD 그리고 등장했습니다. write() 함수 호출은, AT&T UNIX 그리고 등장했습니다.