write(시스템콜)
write (system call)쓰기는 Unix와 유사한 운영 체제 커널에 의해 제공되는 가장 기본적인 루틴 중 하나입니다.사용자가 선언한 버퍼에서 파일 등의 특정 장치에 데이터를 씁니다.이것은 시스템 호출을 직접 사용하여 프로그램에서 데이터를 출력하는 주요 방법입니다.수신처는 숫자 코드로 식별됩니다.예를 들어 텍스트와 같이 쓸 데이터는 바이트 수로 지정된 포인터와 크기로 정의됩니다.
write
에는 다음 3가지 인수가 있습니다.
POSIX 사용 현황
쓰기 콜 인터페이스는[1][2][3] POSIX 사양에 따라 표준화되어 있습니다.쓰기 함수를 호출하여 파일에 데이터를 씁니다.기능 프로토타입은 다음과 같습니다.
ssize_t 쓰다(인트 fd, 컨스턴트 무효 *부프, size_t 바이트 수);
논쟁 | 묘사 |
---|---|
fd | 오픈 콜에서 취득한 파일 기술자입니다.정수값입니다.값 0, 1, 2는 표준 입력, 표준 출력 및 표준 오류에 대해서도 지정할 수 있습니다. |
부프 | fd가 가리키는 파일에 쓸 내용이 포함된 문자 배열을 가리킵니다. |
바이트 수 | 문자 배열에서 fd가 가리키는 파일에 쓸 바이트 수를 지정합니다. |
위의 구문에서는ssize_t
는 입니다.typedef
. 에서 정의된 서명된 데이터 유형입니다.stddef.h
주의해 주세요.write()
는 부호 없는 값을 반환하지 않습니다.오류가 발생하면 -1을 반환하기 때문에 부호 있는 값을 반환해야 합니다.
write 함수는 파일에 정상적으로 기입된 바이트 수를 반환합니다.이 바이트 수는 지정된nbytes보다 작을 수 있습니다.예외 조건이 발생하면 -1이 반환됩니다.아래 오류 섹션을 참조하십시오.
사용 예
#실패하다 <stdio.h> #실패하다 <문자열>h> #실패하다 <stdlib.h> #실패하다 <fcntl.h> #실패하다 <리스트 없음.h> 인트 주된 (인트 argc, 차 *argv[]) { 인트 fd1; 차 부프[128]; fd1 = 열다.(argv[1], O_WR만); 한다면 (fd1 == -1) { 에러(argv[1]); 돌아가다 EXIT_FAILURE; } /* 파일에 쓸 데이터를 입력합니다*/ 스캔("%s", 부프); 쓰다(fd1, 부프, 스트렌(부프)); /* fd1은 파일 기술자, buf는 다음 작업에 사용되는 문자 배열입니다. 데이터를 보유하면 strlen(buf)은 함수에 바이트 수가 데이터 길이와 같음을 알립니다. 버퍼 내의 문자열을 복사해야 합니다.* / 가까운.(fd1); 돌아가다 0; }
작업 중 오류가 발생했습니다.
다음은 파일에 쓰는 동안 발생할 수 있는 몇 가지[4][5] 오류입니다.에러는, errno.h 에 리스트 되고 있는 매크로입니다.
에러 번호 | 에러 | 의미. |
---|---|---|
4 | EINTR | 시스템 호출이 중단되었습니다. |
5 | EIO | 하드웨어 읽기/쓰기 작업과 관련된 낮은 수준의 오류입니다. |
9 | EBADF | 파일 설명자 fd가 잘못되었거나 '읽기 전용' 모드로 열린 파일에 쓰려고 시도 중입니다. |
13 | EACES | 사용자에게 파일에 쓰는 데 필요한 권한이 없습니다. |
14 | 디폴트 | 함수에 지정된 주소가 올바르지 않은 주소입니다. |
22 | 에인 | 함수와 함께 전달된 인수가 잘못되었습니다. |
27 | EFBIG | nbytes 단위로 지정된 파일 크기가 너무 커서 시스템에서 허용하는 크기보다 큽니다. |
28 | enosp | 스토리지 디바이스에 쓸 수 있는 공간이 없습니다. |
32 | 에피페 | 파이프가 파손되었거나 파이프의 다른 쪽 끝에 있는 파일이 I/O 목적으로 열려 있지 않습니다(이러한 유형의 오류가 발생하는 대부분의 프로세스도 SIGPIPE 신호를 생성합니다). |
쓰기를 호출하는 상위 수준의 I/O 함수
쓰기 시스템 호출은 매우 유사하지만 일반적인 함수가 아닙니다.예를 들어 x86 아키텍처를 사용하는 Linux에서 시스템콜은 INT 80H 명령을 사용하여 제어를 [6]커널로 전송합니다.쓰기 시스템 호출 및 읽기 기능은 낮은 수준의 함수이므로 바이트만 인식할 수 있습니다.클래스와 같이 레코드를 쓰는 데 쓰기를 사용할 수 없습니다.따라서 printf와 같은 높은 수준의 입출력 기능이 필요합니다.많은 경우 어수선한 로우레벨인터페이스에 비해 하이레벨인터페이스가 선호됩니다.이러한 함수는 내부적으로 다른 함수를 호출하고, 이러한 함수는 쓰기 호출을 할 수 있으므로 [7][8]함수의 계층화된 어셈블리가 발생합니다.
이 어셈블리를 사용하면 상위 수준의 함수는 바이트의 데이터를 수집한 다음 필요한 데이터를 파일에 쓸 수 있습니다.
「 」를 참조해 주세요.
레퍼런스
- ^ http://www.unix.com/man-page/FreeBSD/2/write/ 쓰기 매뉴얼 페이지
- ^ https://www.gnu.org/s/hello/manual/libc/I_002fO-Primitives.html#I_002fO-Primitives I/O 프리미티브
- ^ "Write".
- ^ https://www.gnu.org/s/hello/manual/libc/Error-Codes.html GNU C 라이브러리 매뉴얼
- ^ 오류를 나열하는 http://www.ibm.com/developerworks/aix/library/au-errnovariable/ IBM 페이지
- ^ Bob Neveln ISBN 978-0-13-087940-0에 의한 LINUX 어셈블리 언어 프로그래밍
- ^ https://www.gnu.org/s/libc/ GNU C 라이브러리
- ^ http://ftp.gnu.org/gnu/glibc/ GNU C 라이브러리 다운로드