■ 파일에 데이터를 출력하는 함수.

(1) write() - 파일 쓰기

○ 함수원형
  ssize_t write (int fd, const void *buf, size_t nbytes);

○ 리턴값
성공 시 : 전달한 바이트 수, 실패 시 : -1

- fd : 데이터 전송 영역을 나타내는 파일 디스크립터.
- buf : 전송할 데이터를 가지고 있는 버퍼의 포인터.
- nbytes : 전송할 데이터의 바이트 수.

=> 리눅스에서는 파일과 소켓을 동일하게 취급 하므로 소켓을 통해서 다른 호스트에게 데이터를 전송 할 때에도
     write() 함수를 사용한다.



(2) write기능 구현 소스 예제

○ Source

○ Compile & Result

- data.txt 파일을 오픈해서, scanf로 입력받은 문자열을 저장한다.


(3) 동작방식 - 지연쓰기
: write() 호출에서 돌아올 때, 사용자 영역에서 커널에 넘긴 버퍼에서 커널버퍼로 자료가 복사된 상태이긴 하지만, 의도한 목적지에 자료를 썼다는 보장은 못한다. 실제로 쓰기 호출에서 돌아오는 시간은 자료를 쓰기에는 너무 촉박하므로, 프로세서와 하드 디스크 사이에 벌어지는 성능 격차는 명백하게 느린 동작 방식이 드러나게 만든다.

- 사용자 영역에 존재하는 응용이 write() 시스템 호출을 부르면, 리눅스 커널은 몇가지 점검을 수행한다.
- 이후 자료를 버퍼에 복사해 놓고 나중에 커널은 모든 '변경된' 버퍼를 수집해 최적 수준으로 정렬하여 디스크에 쓴다.
- 이런 방식은 쓰기 호출을 번개처럼 빠르게 수행해서 거의 즉시 반환하도록 만든다.
- 또한 커널은 좀 더 여유가 생길 때까지 쓰기 작업을 늦춰서 한꺼번에 여러 작업을 모아 배치로 수행한다.

'P rogramming > Linux System' 카테고리의 다른 글

오류처리 - perror(), strerror()  (0) 2012.03.06
파일 읽기 - read()  (0) 2012.03.06
파일 오픈 - open() / creat()  (0) 2012.03.06
좀비프로세스의 원인과 종료  (0) 2012.03.02
네트워크 주소 변환 - inet_ntoa()  (2) 2012.02.29
by 민트앤라떼 2012. 3. 6. 18:10