write, writex, write64x, writev, writevx, ewrite, ewritev, pwrite 또는 pwritev 서브루틴
용도
파일에 씁니다.
라이브러리
| 항목 | 설명 |
|---|---|
| 쓰기, 쓰기x, write64x, 쓰기v, 쓰기vx, pwrite, pwritev | 표준 C 라이브러리(libc.a) |
| ewrite, ewritev | MLS 라이브러리libmls.a |
구문
#include <unistd.h> ssize_t write (FileDescriptor, Buffer, NBytes)
int FileDescriptor;
const void * Buffer;
size_t NBytes;
int writex (FileDescriptor, Buffer, NBytes, Extension)
int FileDescriptor;
char *Buffer;
unsigned int NBytes;
int Extension;
int write64x (FileDescriptor, Buffer, NBytes, Extension)
int FileDescriptor;
void *Buffer;
size_t NBytes;
void *Extension;
ssize_t pwrite (FileDescriptor, Buffer, NBytes, Offset)
int FileDescriptor;
const void * Buffer;
size_t NBytes;
off_t Offset; #include <sys/uio.h> ssize_t writev (FileDescriptor, iov, iovCount)
int FileDescriptor;
const struct iovec * iov;
int iovCount;
ssize_t writevx (FileDescriptor, iov, iovCount, Extension)
int FileDescriptor;
struct iovec *iov;
int iovCount;
int Extension; #include <unistd.h>
#include <sys/uio.h> ssize_t pwritev (
int FileDescriptor,
const struct iovec * iov,
int iovCount,
offset_t offset);
ssize_t ewrite (FileDescriptor, Buffer, Nbytes, labels)
int FileDescriptor;
const void * Buffer;
size_t NBytes;
sec_labels_t * labels;
ssize_t ewritev (FileDescriptor, iov, iovCount,labels)
int FileDescriptor;
const struct iovec * iov;
int iovCount;
sec_labels_t * labels;
설명
쓰기 서브루틴은 Buffer 매개변수가 가리키는 버퍼에서 FileDescriptor 매개변수와 연결된 파일에 NBytes 매개변수로 지정된 데이터 바이트 수를 쓰려고 시도합니다.
Writev 서브루틴은 동일한 작업을 실행하지만 iov 파라미터가 가리키는 iovec 구조체 배열로 지정된 iovCount 버퍼에서 출력 데이터를 수집합니다. 각 iovec 항목은 데이터가 기록되는 메모리 영역의 기본 주소와 길이를 지정합니다. Writev 서브루틴은 항상 다음 단계로 진행하기 전에 전체 영역을 씁니다.
Writex 및 writevx 서브루틴은 일부 장치 드라이버에 쓰는 데 사용되는 Extension 매개변수가 추가된 것을 제외하면 write 및 writev 서브루틴과 동일합니다.
일반 파일과 탐색이 가능한 장치의 경우, 실제 데이터 쓰기는 파일 포인터가 가리키는 파일 내 위치에서 진행됩니다. 쓰기 서브루틴에서 반환되면 파일 포인터는 쓰여진 바이트 수만큼 증가합니다.
탐색 기능이 없는 장치에서는 항상 현재 위치에서 쓰기가 시작됩니다. 이러한 장치와 연결된 파일 포인터의 값은 정의되지 않습니다.
쓰기에서 공간보다 많은 바이트(예: 미디어의 한계 또는 물리적 끝)를 쓰도록 요청하는 경우, 공간에 해당하는 만큼의 바이트만 기록됩니다. 예를 들어 파일 용량이 제한에 도달하기 전에 파일에 20바이트의 공간이 더 있다고 가정해 보겠습니다. 512바이트 쓰기는 20을 반환합니다. 다음에 0이 아닌 바이트 수를 쓰면 실패 리턴이 발생하고(현재 항목에서 언급된 경우 제외) 구현은 스레드에 대한 SIGXFSZ 신호를 생성합니다.
요청을 충족할 공간이 충분하지 않으면 요청된 것보다 적은 바이트가 기록될 수 있습니다. 여기에는 기록된 바이트 수가 반환됩니다. 다음 번에 0이 아닌 바이트 수를 쓰려고 시도하면 실패합니다(다음 텍스트에서 언급된 경우 제외). 도달하는 한계는 최대 서브루틴에 의해 설정된 한계 또는 물리적 매체의 끝일 수 있습니다.
쓰기 서브루틴이 성공적으로 완료되면 다음 사항이 모두 참이면 파일의 SetUserID 비트(S_ISUID)가 지워집니다:
- 호출 프로세스에 루트 사용자 권한이 없습니다.
- 호출 프로세스의 유효 사용자 ID가 파일의 사용자 ID와 일치하지 않습니다.
- 파일은 그룹(S_IXGRP) 또는 기타(S_IXOTH)에서 실행할 수 있습니다.
쓰기 서브루틴은 다음 사항이 모두 참이면 SetGroupID 비트(S_ISGID)를 지웁니다:
- 호출 프로세스에 루트 사용자 권한이 없습니다.
- 파일의 그룹 ID가 유효 그룹 ID 또는 프로세스의 보조 그룹 ID 중 하나와 일치하지 않습니다.
- 이 파일은 소유자(S_IXUSR) 또는 다른 사용자(S_IXOTH)가 실행할 수 있습니다.
파일 상태의 O_APPEND 플래그가 설정되어 있으면 각 쓰기 전에 파일 오프셋이 파일 끝으로 설정됩니다.
FileDescriptor 매개변수가 파일 상태 플래그가 O_SYNC를 지정하는 일반 파일을 참조하는 경우 이 작업은 동기식 업데이트입니다( 열기 하위 루틴에 설명된 대로).
FileDescriptor 매개변수가 프로세스가 O_DEFER 파일 상태 플래그가 설정된 상태에서 여는 일반 파일을 참조하는 경우, 프로세스가 fsync 하위 루틴을 실행하거나 동기 업데이트를 수행할 때까지 데이터 및 파일 크기가 영구 저장소에서 업데이트되지 않습니다. O_DEFER 파일 상태 플래그가 설정된 파일을 연 모든 프로세스가 fsync 하위 루틴을 실행하거나 동기 업데이트를 수행하기 전에 파일을 닫으면 영구 저장소에서 데이터와 파일 크기가 업데이트되지 않습니다.
파이프에 대한 쓰기 요청(또는 선입선출(FIFO))은 다음과 같은 예외를 제외하고 일반 파일과 동일하게 처리됩니다:
- 파이프와 관련된 파일 오프셋이 없으므로 각 쓰기 요청은 파이프의 끝에 추가됩니다.
- 쓰기 요청의 크기가 PIPE_BUF 시스템 변수 값( pathconf 루틴에 설명되어 있음)보다 작거나 같으면 쓰기 서브루틴이 자동으로 실행됩니다. 데이터는 동일한 파이프에 있는 다른 쓰기 프로세스의 데이터와 인터리빙되지 않습니다. PIPE_BUF 바이트보다 큰 쓰기에는 임의의 경계에서 다른 프로세스에 의한 쓰기와 인터리빙된 데이터가 있을 수 있으며, 이는 O_NDELAY 또는 O_NONBLOCK 파일 상태 플래그가 설정되어 있든 상관없습니다.
- O_NDELAY 및 O_NONBLOCK 파일 상태 플래그가 지워진 경우(기본값), 전체 파이프에 대한 쓰기 요청은 전체 요청을 처리할 수 있는 충분한 공간이 확보될 때까지 프로세스를 차단합니다.
- O_NDELAY 파일 상태 플래그가 설정되어 있으면 전체 파이프에 쓰면 0을 반환합니다.
- O_NONBLOCK 파일 상태 플래그가 설정되어 있으면 전체 파이프에 쓰면 ' -1 ' 값이 반환되고 errno 전역 변수가 EAGAIN으로 설정됩니다.
시스템이 비차단 쓰기를 지원하는 문자 특수 파일에 쓰기를 시도하는데 현재 데이터를 쓸 수 없는 경우(스트림은 나중에 설명하는 예외입니다):
- O_NDELAY 및 O_NONBLOCK 플래그가 지워진 경우(기본값), 쓰기 서브루틴은 데이터를 쓸 수 있을 때까지 차단합니다.
- O_NDELAY 플래그가 설정되어 있으면 쓰기 서브루틴은 0을 반환합니다.
- O_NONBLOCK 플래그가 설정되어 있으면 쓰기 서브루틴은 ' -1 '을 반환하고 데이터를 쓸 수 없는 경우 errno 전역 변수를 EAGAIN으로 설정합니다.
시스템에서 강제 모드 레코드 잠금을 지원하는 일반 파일에 쓰기를 시도할 때 기록할 영역의 전체 또는 일부가 다른 프로세스에 의해 잠겨 있는 경우 다음과 같은 상황이 발생할 수 있습니다:
- O_NDELAY 및 O_NONBLOCK 파일 상태 플래그가 지워진 경우(기본값), 호출 프로세스는 잠금이 해제될 때까지 차단합니다.
- O_NDELAY 또는 O_NONBLOCK 파일 상태 플래그가 설정된 경우 쓰기 서브루틴은 ' -1 ' 값을 반환하고 errno 전역 변수를 EAGAIN으로 설정합니다.
필드가 스트림을 가리키는 경우, 쓰기 작업은 스트림이 허용하는 최소 및 최대 n바이트 범위("패킷 크기")의 값에 따라 결정됩니다. 이러한 값은 최상위 스트림 모듈에 의해 결정됩니다. N바이트가 패킷 크기 범위 내에 있으면 n바이트 바이트가 기록됩니다. N바이트가 범위 내에 속하지 않고 최소 패킷 크기 값이 0이면 쓰기에서는 데이터를 다운스트림으로 보내기 전에 버퍼를 최대 패킷 크기 세그먼트로 분할합니다(마지막 세그먼트는 최대 패킷 크기보다 작은 크기를 포함합니다). N바이트가 범위 내에 속하지 않고 최소값이 0이 아닌 경우, errno가 ERANGE로 설정되어 쓰기가 실패합니다. 길이가 0인 버퍼(n바이트는 0)를 스트림 장치에 쓰면 0바이트가 반환되고 0바이트가 전송됩니다. 그러나 길이가 0인 버퍼를 스트림 기반 파이프 또는 FIFO에 쓰면 메시지가 전송되지 않고 0이 반환됩니다. 이 프로세스는 I_SWROPT ioctl을 실행하여 길이가 0인 메시지를 파이프 또는 FIFO를 통해 전송할 수 있도록 합니다.
시스템이 스트림에 쓰면 데이터 메시지는 우선순위 대역이 0으로 생성됩니다. 파이프나 FIFO가 아닌 스트림에 쓰는 경우:
- O_NONBLOCK '은 ' O_NONBLOCK ' 또는 ' O_NDELAY' 중 하나를 지정합니다. IBM® 스트림 구현에서는 이 두 가지를 동일하게 취급합니다.
- O_NONBLOCK 또는 O_NDELAY가 지워지고 스트림이 데이터를 받아들일 수 없는 경우(내부 흐름 제어 조건으로 인해 스트림 쓰기 대기열이 가득 찬 경우), 데이터를 받아들일 수 있을 때까지 쓰기 블록이 설정됩니다.
- O_NONBLOCK 또는 O_NDELAY가 설정되어 있고 스트림이 데이터를 수신할 수 없는 경우, 쓰기에서 ' -1 '을 반환하고 errno를 EAGAIN으로 설정합니다.
- 스트림이 더 이상 데이터를 받아들일 수 없는 상태가 발생하면서 버퍼의 일부가 쓰여진 상태에서 O_NONBLOCK 또는 O_NDELAY가 설정되어 있으면 쓰기가 종료되고 쓰여진 바이트 수를 반환합니다.
또한 스트림 헤드가 호출 전에 비동기 오류를 처리하면 쓰기 및 쓰기v가 실패합니다. 여기서 errno의 값은 쓰기 또는 쓰기v의 결과를 반영하지 않고 이전 오류를 반영합니다.
' writev ' 함수는 ' 쓰기' 함수와 동일하지만, 멤버가 지정한 ' iovcnt 버퍼에서 출력 데이터를 수집합니다 iOV 배열: IOV[0], IOV[1],..., iOV[IOVCNT - 1]. iovcnt는 0보다 크고 limits.h 정의된 {IOV_MAX} 작거나 같으면 유효합니다.
각 iovec 항목은 데이터가 기록되는 메모리 영역의 기본 주소와 길이를 지정합니다. Writev 함수는 항상 다음 영역으로 넘어가기 전에 전체 영역을 씁니다.
Fildes가 일반 파일을 참조하고 iov가 가리키는 배열의 모든 iov_len 멤버가 0인 경우 writev는 0을 반환하고 다른 영향을 미치지 않습니다. 다른 파일 형식의 경우 동작이 지정되지 않습니다.
Iov_len 값의 합이 SSIZE_MAX보다 크면 작업이 실패하고 데이터가 전송되지 않습니다.
중단된 쓰기 서브루틴의 동작은 도착 신호에 대한 핸들러가 어떻게 설치되었는지에 따라 달라집니다. 핸들러는 다음 두 가지 방법 중 하나로 설치할 수 있습니다:
- 처리기가 서브루틴을 다시 시작하지 말라는 표시와 함께 설치된 경우, 쓰기 서브루틴은 ' -1 ' 값을 반환하고 errno 전역 변수를 EINTR로 설정합니다(일부 데이터가 이미 쓰여진 경우에도).
- 처리기가 서브루틴을 다시 시작하라는 표시와 함께 설치되어 있고:
- 인터럽트가 처리될 때 데이터가 기록되지 않은 경우 쓰기 서브루틴은 값을 반환하지 않습니다(다시 시작됩니다).
- 인터럽트가 처리될 때 데이터가 쓰여진 경우, 이 쓰기 서브루틴은 이미 쓰여진 데이터의 양을 반환합니다.
write64x 서브루틴은 writex 서브루틴과 동일하며, 확장 파라미터는 j2_ext 구조체에 대한 포인터입니다( j2/j2_cntl.h 파일 참조). write64x 서브루틴은 원시 모드에서 암호화된 파일을 쓰는 데 사용됩니다( fcntl.h 파일에서 O_RAW 참조). 암호화된 파일에 O_RAW 플래그를 사용하는 것은 일반 파일에 O_DIRECT를 사용하는 것과 동일한 제한이 있습니다.
Ewrite 및 ewritev 서브루틴은 스트림에 쓰고 보안 속성을 설정합니다. Ewrite 서브루틴은 Buffer 매개변수가 가리키는 버퍼에서 Nbyte 매개변수로 지정된 데이터의 바이트 수를 FileDescriptor 매개변수와 연결된 스트림으로 복사합니다. 메시지에 대한 보안 정보는 레이블 매개변수가 가리키는 구조의 값으로 설정됩니다.
Pwrite 함수는 파일 포인터를 변경하지 않고 지정된 위치에 쓴다는 점을 제외하면 쓰기와 동일한 작업을 수행합니다. ' pwrite '의 처음 세 인수는 ' 쓰기 '와 동일하지만 파일 내에서 원하는 위치에 대해 오프셋되는 네 번째 인수가 추가됩니다.
ssize_t pwrite64(int fd , const void *buf , size_t nbytes , off64_t offset)The pwrite64 subroutine conducts the same action as pwrite but the limit of offset to the maximum file size for the file that is associated with the fileDescriptor and DEV_OFF_MAX if the file associated with fileDescriptor is a block special or character special file.
Shm_open 서브루틴 호출에서 얻은 파일 설명자와 함께 쓰기 또는 pwrite 서브루틴을 사용하면 ENXIO에서 실패합니다.
' pwritev 서브루틴은 ' writev ' 서브루틴과 동일한 작업을 수행하지만, ' pwritev ' 서브루틴은 파일 포인터를 변경하지 않고 파일에서 지정된 위치에 쓴다는 점을 제외하면 다릅니다. Pwritev 서브루틴의 처음 세 개의 인수는 파일 내에서 원하는 위치를 가리키는 오프셋 인수가 추가되었다는 점을 제외하면 writev 서브루틴과 동일합니다. Pwritev 서브루틴이 쓰는 파일을 찾을 수 없는 경우 오류가 발생합니다.
매개변수
| 항목 | 설명 |
|---|---|
| 버퍼 | 기록할 데이터가 들어 있는 버퍼를 식별합니다. |
| 확장자 | 추가 정보가 필요하거나 추가 상태를 반환하는 문자 장치 드라이버와의 통신을 제공합니다. 각 드라이버는 장치에 따라 확장 매개변수를 값 또는 통신 영역에 대한 포인터로 해석합니다. 확장 매개변수 값이 0인 경우 드라이버는 합리적인 기본값을 적용해야 합니다. |
| FileDescriptor | 데이터를 기록할 개체를 식별합니다. |
| iov | 기록할 데이터가 들어 있는 버퍼를 식별하는 iovec 구조의 배열을 가리킵니다. Iovec 구조는 sys/uio.h 파일에 정의되어 있으며 다음과 같은 멤버를 포함합니다: |
| iovCount | Iov 파라미터가 가리키는 iovec 구조의 수를 지정합니다. |
| NBytes | 쓸 바이트 수를 지정합니다. |
| 오프셋 | 파일에서 쓰기가 시작되는 위치입니다. |
| 레이블 | 확장된 보안 속성 구조에 대한 포인터입니다. |
리턴 값
성공적으로 완료되면 쓰기, 쓰기x, write64x, 쓰기v, 쓰기vx 및 pwritev 서브루틴은 쓰여진 바이트 수를 반환합니다. 기록되는 바이트 수는 NBytes 매개변수에 지정된 값보다 크지 않습니다. 그렇지 않으면 ' -1 ' 값이 반환되고 errno 전역 변수가 오류를 나타내도록 설정됩니다.
성공적으로 완료되면 ewrite 및 ewritev 서브루틴은 0 값을 반환합니다. 그렇지 않으면 오류를 식별하기 위해 전역 변수 errno가 설정됩니다.
오류 코드
' 쓰기, ' writex' , write64x' , ' writev' , ' writevx' , ' 쓰기' , ' ewritev' , ' pwritev ' 서브루틴은 다음 중 하나 이상이 참이면 성공하지 못합니다:
| 항목 | 설명 |
|---|---|
| EAGAIN | 이 파일에 O_NONBLOCK 플래그가 설정되어 쓰기 작업에서 프로세스가 지연되거나, 쓰기하려는 파일 부분에 강제 적용 모드 레코드 잠금이 해제되지 않은 경우입니다. |
| EBADF | FileDescriptor 매개변수가 쓰기 위해 열려 있는 유효한 파일 설명자를 지정하지 않습니다. |
| EDQUOT | 파일 시스템에서 디스크 블록의 사용자 또는 그룹 할당량이 모두 소진되어 파일에 새 디스크 블록을 할당할 수 없습니다. |
| EFBIG | 32비트 커널에서 MAX_FILESIZE보다 큰 오프셋이 요청되었습니다. |
| 기본값 | Buffer 매개변수 또는 iov 매개변수의 일부가 프로세스에 할당된 주소 공간 외부의 위치를 가리킵니다. |
| EFBIG | 프로세스의 파일 크기 제한 또는 최대 파일 크기를 초과하는 파일을 쓰려고 시도했습니다. 사용자가 프로세스를 실행하기 전에 환경 변수 XPG_SUS_ENV=ON을 설정하면 프로세스의 파일 크기 제한을 초과할 때 SIGXFSZ 신호가 프로세스에 게시됩니다. |
| EINVAL | FileDescriptor 매개 변수와 연결된 파일 위치 포인터가 음수이거나, iovCount 매개 변수 값이 1 - 16을 포함하지 않거나, iov 배열의 iov_len 값 중 하나가 음수인 경우입니다. |
| EINVAL | 32비트 또는 64비트 커널 환경에서 32비트 애플리케이션의 iov_len 값의 합이 32비트 부호 있는 정수를 오버플로했거나 32비트 커널 환경에서 64비트 애플리케이션의 iov_len 값의 합이 32비트 부호 있는 정수를 오버플로한 경우입니다. |
| EINVAL | 파일 설명자가 참조하는 스트림 또는 멀티플렉서는 멀티플렉서에서 다운스트림으로 (직접 또는 간접적으로) 연결됩니다. |
| EINVAL | 32비트 커널에서 OFF_MAX보다 큰 Nbytes 매개변수 값을 요청했습니다. 여기서 시스템 호출은 32비트 커널에서 실행되는 64비트 애플리케이션에서 요청됩니다. |
| EINTR | 쓰기 작업 중에 신호가 포착되어 신호 처리기가 서브루틴을 다시 시작하지 말라는 표시와 함께 설치되었습니다. |
| EIO | 시스템이 파일 시스템에 쓰는 동안 I/O 오류가 발생했거나, 프로세스가 제어 터미널에 쓰기를 시도하는 백그라운드 프로세스 그룹의 구성원이고, TOSTOP이 설정되어 있고, 프로세스가 SIGTTOU를 무시하거나 차단하지 않으며, 프로세스 그룹에 부모 프로세스가 없는 경우입니다. |
| ENOSPC | 파일이 포함된 파일 시스템에 여유 공간이 남아 있지 않습니다. |
| ENXIO | 쓰기 중인 스트림에서 끊김 현상이 발생했습니다. 쓰기 또는 쓰기 서브루틴은 shm_open 서브루틴에 대한 호출에서 얻은 파일 설명자와 함께 사용되었습니다. |
| EPIPE | 어떤 프로세스에서 읽기 위해 열지 않은 파일 또는 피어 소켓에 연결되지 않은 SOCK_STREAM 유형의 소켓에 쓰기를 시도했거나 어떤 프로세스에서 읽기 위해 열지 않은 파이프 또는 FIFO에 쓰기를 시도했습니다. 이 조건이 발생하면 시그파이프 신호가 프로세스에 전송됩니다. |
| ERANGE | 전송 요청 크기가 FileDescriptor 연결된 STREAMS 파일에서 지원하는 범위를 벗어났습니다. |
다음과 같은 경우 쓰기, 쓰기x, 쓰기v, 쓰기vx 및 pwritev 서브루틴이 실패할 수 있습니다:
| 항목 | 설명 |
|---|---|
| ENXIO | 존재하지 않는 디바이스에 대한 요청이 이루어졌거나 디바이스의 기능을 벗어난 요청입니다. |
| EFBIG | N바이트가 0보다 크고 시작 오프셋이 FileDescriptor 연결된 열린 파일 설명에 설정된 최대 오프셋보다 크거나 같은 일반 파일에 쓰려고 시도했습니다. |
| EINVAL | 오프셋 인수가 유효하지 않습니다. 값은 음수입니다. |
| ESPIPE | fildes는 파이프 또는 FIFO와 연관됩니다. |
| 항목 | 설명 |
|---|---|
| EINVAL | j2_ext 구조가 올바르게 초기화되지 않았습니다. 예를 들어 버전이 잘못되었거나 파일이 암호화되지 않은 경우입니다. |
| EINVAL | j2_ext 구조는 원시 모드에서 열지 않은 파일에 대해 J2EXTCMD_RDRAW 명령을 사용하여 전달됩니다. |
| 항목 | 설명 |
|---|---|
| ENOMEM | 메모리 또는 공간이 너무 작습니다. |
| EACCES | 권한이 거부되었습니다. 사용자에게 데이터 쓰기 권한이 충분하지 않습니다. |
| ERESTART | ERESTART는 시스템 호출을 다시 시작할 수 있는지 여부를 결정하는 데 사용됩니다. |