write(시스템콜)

write (system call)

쓰기는 Unix와 유사한 운영 체제 커널에 의해 제공되는 가장 기본적인 루틴 중 하나입니다.사용자가 선언한 버퍼에서 파일 등의 특정 장치에 데이터를 씁니다.이것은 시스템 호출을 직접 사용하여 프로그램에서 데이터를 출력하는 주요 방법입니다.수신처는 숫자 코드로 식별됩니다.예를 들어 텍스트와 같이 쓸 데이터는 바이트 수로 지정된 포인터와 크기로 정의됩니다.

write에는 다음 3가지 인수가 있습니다.

  1. 파일 코드(파일 기술자 또는 fd).
  2. 데이터가 저장되는 버퍼로의 포인터(buf).
  3. 버퍼에서 쓰는 바이트 수(nbytes).

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 함수

쓰기를 호출하는 높은 수준의 I/O 함수

쓰기 시스템 호출은 매우 유사하지만 일반적인 함수가 아닙니다.예를 들어 x86 아키텍처를 사용하는 Linux에서 시스템콜은 INT 80H 명령을 사용하여 제어를 [6]커널로 전송합니다.쓰기 시스템 호출 및 읽기 기능은 낮은 수준의 함수이므로 바이트만 인식할 수 있습니다.클래스와 같이 레코드를 쓰는 데 쓰기를 사용할 수 없습니다.따라서 printf와 같은 높은 수준의 입출력 기능이 필요합니다.많은 경우 어수선한 로우레벨인터페이스에 비해 하이레벨인터페이스가 선호됩니다.이러한 함수는 내부적으로 다른 함수를 호출하고, 이러한 함수는 쓰기 호출을 할 수 있으므로 [7][8]함수의 계층화된 어셈블리가 발생합니다.

이 어셈블리를 사용하면 상위 수준의 함수는 바이트의 데이터를 수집한 다음 필요한 데이터를 파일에 쓸 수 있습니다.

「 」를 참조해 주세요.

레퍼런스

  1. ^ http://www.unix.com/man-page/FreeBSD/2/write/ 쓰기 매뉴얼 페이지
  2. ^ https://www.gnu.org/s/hello/manual/libc/I_002fO-Primitives.html#I_002fO-Primitives I/O 프리미티브
  3. ^ "Write".
  4. ^ https://www.gnu.org/s/hello/manual/libc/Error-Codes.html GNU C 라이브러리 매뉴얼
  5. ^ 오류를 나열하는 http://www.ibm.com/developerworks/aix/library/au-errnovariable/ IBM 페이지
  6. ^ Bob Neveln ISBN 978-0-13-087940-0에 의한 LINUX 어셈블리 언어 프로그래밍
  7. ^ https://www.gnu.org/s/libc/ GNU C 라이브러리
  8. ^ http://ftp.gnu.org/gnu/glibc/ GNU C 라이브러리 다운로드

외부 링크