리눅스 API의 모든 것 Vol. 2 고급 리눅스 API [스레드, IPC, 소켓, 고급 I/O]
- 원서명The Linux Programming Interface: A Linux and UNIX System Programming Handbook (ISBN 9781593272203)
- 지은이마이클 커리스크
- 옮긴이김기주, 김영주, 우정은, 지영민, 채원석, 황진호
- ISBN : 9788960773202
- 35,000원
- 2012년 07월 12일 펴냄
- 페이퍼백 | 852쪽 | 188*255mm
- 시리즈 : 오픈소스 프로그래밍
책 소개
소스 파일은 아래 링크에서 내려 받으실 수 있습니다.
(https://www.man7.org/tlpi/code/download/tlpi-201025-book.tar.gz)
리눅스에서 프로그램을 작성할 때 사용하는 시스템 호출과 라이브러리 함수를 설명한 책으로, 해당 함수를 사용할 수 있는 리눅스 버전, 버전별 차이 등을 꼼꼼하게 정리했다. 워낙 방대한 내용이라 1권과 2권으로 나눠 구성했으며, 2권은 고급편으로, 좀더 세련되고 복잡한 리눅스 프로그램을 만들 때 사용되는 스레드 관리, IPC 사용법, 소켓 사용법 등을 다룬다.
[ 소개 ]
리눅스와 유닉스 시스템 프로그래밍 인터페이스를 빠짐없이 다룬 최고의 안내서!
『리눅스 API의 모든 것』은 리눅스와 유닉스 프로그래밍 인터페이스(리눅스나 유닉스 시스템에서 동작하는 거의 모든 응용 프로그램이 사용하는 인터페이스)을 위한 최고의 안내서다.
리눅스 프로그래밍 전문가 마이클 커리스크는 이 권위 있는 책에서, 시스템 프로그래밍 기술을 마스터하는 데 필요한 시스템 호출과 라이브러리 함수를 자세히 설명하며, 이에 덧붙여 명확하고 완전한 예제 프로그램을 제공한다.
이 책에서는 1권과 2권 통틀어 500개가 넘는 시스템 호출과 라이브러리 함수, 200개가 넘는 예제 프로그램, 88개의 표, 115개의 다이어그램에 대한 설명이 들어 있으며, 2권에서는 다음과 같은 내용을 설명한다.
■ POSIX 스레드를 이용한 멀티스레드 프로그램 작성법
■ 파이프, 메시지 큐, 공유 메모리, 세마포어를 이용한 프로세스 간 통신
■ 소켓 API를 이용한 네트워크 프로그램 작성법
『리눅스 API의 모든 것』이 epoll, inotify, /proc 파일 시스템 등 수많은 리눅스 고유 기능을 다루지만, 유닉스 표준(POSIX.1-2001/SUSv3와 POSIX.1-2008/SUSv4)을 강조하기 때문에 여타 유닉스 플랫폼에서 작업하는 프로그래머들에게도 마찬가지로 가치가 크다.
『리눅스 API의 모든 것』은 리눅스와 유닉스 프로그래밍 인터페이스를 다룬 가장 포괄적인 책이며, 새로운 고전이 되리라 믿어 의심치 않는다.
[ 이 책의 대상 독자 ]
● 리눅스나 기타 유닉스, 기타 POSIX 호환 시스템용 응응 프로그램을 작성하는 프로그래머와 소프트웨어 설계자
● 리눅스와 기타 유닉스 구현 간이나 리눅스와 기타 운영체제 간에 응용 프로그램을 이식하는 프로그래머
● 리눅스/유닉스 프로그래밍 인터페이스와, 시스템 소프트웨어의 다양한 부분이 어떻게 구현됐는지를 좀 더 잘 이해하고자 하는 시스템 관리자와 ‘파워 유저’
[ 한국어판 출간에 부쳐 ]
『The Linux Programming Interface』 한국 독자 여러분께 인사를 전합니다.
『The Linux Programming Interface』(한국어판 제목: 『리눅스 API의 모든 것』)는 리눅스 시스템 프로그래밍 API를 거의 모두 설명한 책으로서 전통적인 서버, 메인프레임, 데스크탑 시스템부터 근래 리눅스를 사용하는 임베디드 디바이스에 이르기까지 광범위한 리눅스 플랫폼에 적용할 수 있습니다. 뿐만 아니라 리눅스 커널이 안드로이드의 심장부를 이루고 있기 때문에, 이 책 내용의 대부분은 안드로이드 디바이스 상의 프로그래밍에도 응용할 수 있습니다.
이 책의 영문판은 2010년 말에 출간되었습니다. 이후로 9개의 새로운 리눅스 커널 버전이 릴리스되었습니다(버전 2.6.36부터 3.4까지). 그럼에도 영문판과 이 한국어판의 내용은 여전히 최신에 가깝고, 앞으로도 수년 동안 유효할 것입니다. 그 주된 이유는 리눅스 커널의 개발이 매우 빠르지만, 커널-사용자 공간 API의 변경 속도는 매우 느리기 때문입니다(이는 커널이 사용자 공간 응용프로그램의 ‘안정적인’ 기반을 제공하도록 설계된다는 사실의 당연한 결과입니다). 따라서 최근 9개의 커널 버전을 보면, 커널-사용자 공간 API의 변경은 비교적 적었음을 알 수 있습니다. 더욱이 발생한 변경들도 이 책에 설명된 기존 기능의 ‘수정’보다는 이 책에 설명된 인터페이스에 ‘추가’되는 형태를 띱니다(다시 한 번 말하지만, 이는 커널 설계 과정의 자연적인 결과로, 리눅스 커널 개발자들은 ‘기존’ 사용자 공간 API를 깨뜨리지 않기 위해 엄청나게 애씁니다). 궁금한 독자들은 저의 웹사이트 http://man7.org/tlpi/api_changes/에서 영문판이 출판된 이래의 사용자 공간 API 변경 사항들(영문으로 되어 있음)을 찾아볼 수 있습니다.
한국어판의 독자들은 영문판과 한국어판 사이에 약간의 구조적인 차이가 있음을 참조하시면 좋겠습니다. 가장 두드러진 차이는 영문판이 한 권으로 출간된 반면, 한국어판은 한국어로 옮기는 과정에서 책의 분량이 늘어난 이유 때문에 부득이하게 두 권으로 출간된 점입니다. 그 과정에서 몇몇 장들의 순서가 약간 바뀌었습니다. POSIX 스레드를 설명한 5개의 장은 뒤쪽으로 이동하여 한국어판 2권(Vol.2)의 첫 장들로 구성되었습니다(두 권으로 나눌 경우, 저와 출판사는 이렇게 순서를 바꾸는 것이 더 합리적이라고 서로 동의했습니다).
마지막으로, 저의 책이 다른 언어로 번역되는 것은 제게는 크나큰 영광입니다. 제 책에 대한 다수의 번역 작업이 각국에서 현재 진행 중이지만, 한국어판이 세계에서 최초로 출간되는 번역서로 이름을 올렸습니다. 1,500페이지가 넘는 분량을 번역하는 일은 대단한 과업입니다. 멋진 번역을 만들어낸, 부지런하고 빠르게 작업해준 출판사와 번역 팀에게 감사합니다. 저의 작업물과, 이 책을 옮겨 준 번역 팀의 좋은 글과, 영문판에 도움을 준 여러 관계자분들의 노고가 한국어판 독자들에게 많은 도움이 되길 바랍니다.
- 2012년 6월, 독일 뮌헨에서
마이클 커리스크
(https://www.man7.org/tlpi/code/download/tlpi-201025-book.tar.gz)
리눅스에서 프로그램을 작성할 때 사용하는 시스템 호출과 라이브러리 함수를 설명한 책으로, 해당 함수를 사용할 수 있는 리눅스 버전, 버전별 차이 등을 꼼꼼하게 정리했다. 워낙 방대한 내용이라 1권과 2권으로 나눠 구성했으며, 2권은 고급편으로, 좀더 세련되고 복잡한 리눅스 프로그램을 만들 때 사용되는 스레드 관리, IPC 사용법, 소켓 사용법 등을 다룬다.
[ 소개 ]
리눅스와 유닉스 시스템 프로그래밍 인터페이스를 빠짐없이 다룬 최고의 안내서!
『리눅스 API의 모든 것』은 리눅스와 유닉스 프로그래밍 인터페이스(리눅스나 유닉스 시스템에서 동작하는 거의 모든 응용 프로그램이 사용하는 인터페이스)을 위한 최고의 안내서다.
리눅스 프로그래밍 전문가 마이클 커리스크는 이 권위 있는 책에서, 시스템 프로그래밍 기술을 마스터하는 데 필요한 시스템 호출과 라이브러리 함수를 자세히 설명하며, 이에 덧붙여 명확하고 완전한 예제 프로그램을 제공한다.
이 책에서는 1권과 2권 통틀어 500개가 넘는 시스템 호출과 라이브러리 함수, 200개가 넘는 예제 프로그램, 88개의 표, 115개의 다이어그램에 대한 설명이 들어 있으며, 2권에서는 다음과 같은 내용을 설명한다.
■ POSIX 스레드를 이용한 멀티스레드 프로그램 작성법
■ 파이프, 메시지 큐, 공유 메모리, 세마포어를 이용한 프로세스 간 통신
■ 소켓 API를 이용한 네트워크 프로그램 작성법
『리눅스 API의 모든 것』이 epoll, inotify, /proc 파일 시스템 등 수많은 리눅스 고유 기능을 다루지만, 유닉스 표준(POSIX.1-2001/SUSv3와 POSIX.1-2008/SUSv4)을 강조하기 때문에 여타 유닉스 플랫폼에서 작업하는 프로그래머들에게도 마찬가지로 가치가 크다.
『리눅스 API의 모든 것』은 리눅스와 유닉스 프로그래밍 인터페이스를 다룬 가장 포괄적인 책이며, 새로운 고전이 되리라 믿어 의심치 않는다.
[ 이 책의 대상 독자 ]
● 리눅스나 기타 유닉스, 기타 POSIX 호환 시스템용 응응 프로그램을 작성하는 프로그래머와 소프트웨어 설계자
● 리눅스와 기타 유닉스 구현 간이나 리눅스와 기타 운영체제 간에 응용 프로그램을 이식하는 프로그래머
● 리눅스/유닉스 프로그래밍 인터페이스와, 시스템 소프트웨어의 다양한 부분이 어떻게 구현됐는지를 좀 더 잘 이해하고자 하는 시스템 관리자와 ‘파워 유저’
[ 한국어판 출간에 부쳐 ]
『The Linux Programming Interface』 한국 독자 여러분께 인사를 전합니다.
『The Linux Programming Interface』(한국어판 제목: 『리눅스 API의 모든 것』)는 리눅스 시스템 프로그래밍 API를 거의 모두 설명한 책으로서 전통적인 서버, 메인프레임, 데스크탑 시스템부터 근래 리눅스를 사용하는 임베디드 디바이스에 이르기까지 광범위한 리눅스 플랫폼에 적용할 수 있습니다. 뿐만 아니라 리눅스 커널이 안드로이드의 심장부를 이루고 있기 때문에, 이 책 내용의 대부분은 안드로이드 디바이스 상의 프로그래밍에도 응용할 수 있습니다.
이 책의 영문판은 2010년 말에 출간되었습니다. 이후로 9개의 새로운 리눅스 커널 버전이 릴리스되었습니다(버전 2.6.36부터 3.4까지). 그럼에도 영문판과 이 한국어판의 내용은 여전히 최신에 가깝고, 앞으로도 수년 동안 유효할 것입니다. 그 주된 이유는 리눅스 커널의 개발이 매우 빠르지만, 커널-사용자 공간 API의 변경 속도는 매우 느리기 때문입니다(이는 커널이 사용자 공간 응용프로그램의 ‘안정적인’ 기반을 제공하도록 설계된다는 사실의 당연한 결과입니다). 따라서 최근 9개의 커널 버전을 보면, 커널-사용자 공간 API의 변경은 비교적 적었음을 알 수 있습니다. 더욱이 발생한 변경들도 이 책에 설명된 기존 기능의 ‘수정’보다는 이 책에 설명된 인터페이스에 ‘추가’되는 형태를 띱니다(다시 한 번 말하지만, 이는 커널 설계 과정의 자연적인 결과로, 리눅스 커널 개발자들은 ‘기존’ 사용자 공간 API를 깨뜨리지 않기 위해 엄청나게 애씁니다). 궁금한 독자들은 저의 웹사이트 http://man7.org/tlpi/api_changes/에서 영문판이 출판된 이래의 사용자 공간 API 변경 사항들(영문으로 되어 있음)을 찾아볼 수 있습니다.
한국어판의 독자들은 영문판과 한국어판 사이에 약간의 구조적인 차이가 있음을 참조하시면 좋겠습니다. 가장 두드러진 차이는 영문판이 한 권으로 출간된 반면, 한국어판은 한국어로 옮기는 과정에서 책의 분량이 늘어난 이유 때문에 부득이하게 두 권으로 출간된 점입니다. 그 과정에서 몇몇 장들의 순서가 약간 바뀌었습니다. POSIX 스레드를 설명한 5개의 장은 뒤쪽으로 이동하여 한국어판 2권(Vol.2)의 첫 장들로 구성되었습니다(두 권으로 나눌 경우, 저와 출판사는 이렇게 순서를 바꾸는 것이 더 합리적이라고 서로 동의했습니다).
마지막으로, 저의 책이 다른 언어로 번역되는 것은 제게는 크나큰 영광입니다. 제 책에 대한 다수의 번역 작업이 각국에서 현재 진행 중이지만, 한국어판이 세계에서 최초로 출간되는 번역서로 이름을 올렸습니다. 1,500페이지가 넘는 분량을 번역하는 일은 대단한 과업입니다. 멋진 번역을 만들어낸, 부지런하고 빠르게 작업해준 출판사와 번역 팀에게 감사합니다. 저의 작업물과, 이 책을 옮겨 준 번역 팀의 좋은 글과, 영문판에 도움을 준 여러 관계자분들의 노고가 한국어판 독자들에게 많은 도움이 되길 바랍니다.
- 2012년 6월, 독일 뮌헨에서
마이클 커리스크
목차
목차
- 1장 스레드: 소개
- 1.1 개요
- 1.2 Pthreads API의 세부 배경 지식
- 1.3 스레드 생성
- 1.4 스레드 종료
- 1.5 스레드 ID
- 1.6 종료된 스레드와 조인하기
- 1.7 스레드 분리하기
- 1.8 스레드 속성
- 1.9 스레드와 프로세스의 비교
- 1.10 정리
- 1.11 연습문제
- 2장 스레드: 스레드 동기화
- 2.1 공유 변수 접근 보호: 뮤텍스
- 2.2 상태 변화 알리기: 조건 변수
- 2.3 정리
- 2.4 연습문제
- 3장 스레드: 스레드 안전성과 스레드별 저장소
- 3.1 스레드 안전성(그리고 재진입성)
- 3.2 1회 초기화
- 3.3 스레드별 데이터
- 3.4 스레드 로컬 저장소
- 3.5 정리
- 3.6 연습문제
- 4장 스레드: 스레드 취소
- 4.1 스레드 취소하기
- 4.2 취소 상태와 종류
- 4.3 취소 지점
- 4.4 스레드 취소 요청 확인
- 4.5 클린업 핸들러
- 4.6 비동기적 취소 가능성
- 4.7 정리
- 5장 스레드: 기타 세부사항
- 5.1 스레드 스택
- 5.2 스레드와 시그널
- 5.3 스레드와 프로세스 제어
- 5.4 스레드 구현 모델
- 5.5 POSIX 스레드의 리눅스 구현
- 5.6 Pthreads API의 고급 기능
- 5.7 정리
- 5.8 연습문제
- 6장 프로세스 간 통신 개요
- 6.1 IPC 방법의 분류
- 6.2 통신 방법
- 6.3 동기화 방법
- 6.4 IPC 방법 비교하기
- 6.5 정리
- 6.6 연습문제
- 7장 파이프와 FIFO
- 7.1 개요
- 7.2 파이프 만들기와 사용하기
- 7.3 파이프로 프로세스 동기화하기
- 7.4 필터 연결에 파이프 사용하기
- 7.5 파이프를 사용해 셸 명령과 대화하기: popen()
- 7.6 파이프와 stdio 버퍼링
- 7.7 FIFO
- 7.8 FIFO를 사용하는 클라이언트/서버 응용 프로그램
- 7.9 비블로킹 I/O
- 7.10 파이프와 FIFO에서 read()와 write() 함수의 의미
- 7.11 정리
- 7.12 연습문제
- 8장 시스템 V IPC 소개
- 8.1 API 개요
- 8.2 IPC 키
- 8.3 객체 권한과 데이터 구조체의 조합
- 8.4 IPC 식별자와 클라이언트/서버 응용 프로그램
- 8.5 시스템 V IPC get 호출이 사용하는 알고리즘
- 8.6 ipcs 와 ipcrm 명령
- 8.7 모든 IPC 객체 목록 얻기
- 8.8 IPC 설정
- 8.9 정리
- 8.10 연습문제
- 9장 시스템 V 메시지 큐
- 9.1 메시지 큐 생성하기와 열기
- 9.2 메시지 교환
- 9.3 메시지 큐 동작 관리
- 9.4 메시지 큐와 연관된 데이터 구조
- 9.5 메시지 큐 설정
- 9.6 시스템상의 모든 메시지 큐 출력하기
- 9.7 메시지 큐를 사용해 클라이언트/서버 프로그래밍하기
- 9.8 메시지 큐를 사용하는 파일 서버 응용 프로그램
- 9.9 시스템 V 메시지 큐의 불편한 점
- 9.10 정리
- 9.11 연습문제
- 10장 시스템 V 세마포어
- 10.1 개요
- 10.2 세마포어 집합 만들고 열기
- 10.3 세마포어 관리 동작
- 10.4 세마포어와 관련된 데이터 구조
- 10.5 세마포어 초기화
- 10.6 세마포어 동작
- 10.7 다중 블록된 세마포어 동작 처리
- 10.8 세마포어 값 복구
- 10.9 이진 세마포어 프로토콜 구현
- 10.10 세마포어 한도
- 10.11 시스템 V 세마포어의 단점
- 10.12 정리
- 10.13 연습문제
- 11장 시스템 V 공유 메모리
- 11.1 개요
- 11.2 공유 메모리 세그먼트 생성과 열기
- 11.3 공유 메모리 사용
- 11.4 예제: 공유 메모리를 통한 데이터 전송
- 11.5 가상 메모리상의 공유 메모리 위치
- 11.6 공유 메모리에 포인터 저장하기
- 11.7 공유 메모리 제어 동작
- 11.8 공유 메모리와 관련된 데이터 구조체
- 11.9 공유 메모리 한도
- 11.10 정리
- 11.11 연습문제
- 12장 메모리 매핑
- 12.1 개요
- 12.2 매핑 생성: mmap()
- 12.3 맵 영역 해제: munmap()
- 12.4 파일 매핑
- 12.5 매핑된 영역 동기화: msync()
- 12.6 mmap() 추가 플래그
- 12.7 익명 매핑
- 12.8 매핑된 영역 재매핑: mremap()
- 12.9 MAP_NORESERVE와 스왑 영역 낭비
- 12.10 MAP_FIXED 플래그
- 12.11 비선형 매핑: remapfilepages()
- 12.12 정리
- 12.13 연습문제
- 13장 가상 메모리 동작
- 13.1 메모리 보호 모드 변경: mprotect()
- 13.2 mlock()과 mlockall() 메모리 잠금
- 13.3 메모리 상주 결정하기: mincore()
- 13.4 미래의 메모리 사용 패턴: madvise()
- 13.5 정리
- 13.6 연습문제
- 14장 POSIX IPC 소개
- 14.1 API 개요
- 14.2 시스템 V IPC와 POSIX IPC 비교
- 14.3 정리
- 15장 POSIX 메시지 큐
- 15.1 개요
- 15.2 메시지 큐 열기, 닫기, 링크 해제하기
- 15.3 디스크립터와 메시지 큐의 관계
- 15.4 메시지 큐 속성
- 15.5 메시지 교환
- 15.6 메시지 통지
- 15.7 리눅스 고유의 특징
- 15.8 메시지 큐 한도
- 15.9 POSIX와 시스템 V 메시지 큐 비교
- 15.10 정리
- 15.11 연습문제
- 16장 POSIX 세마포어
- 16.1 개요
- 16.2 기명 세마포어
- 16.3 세마포어 동작
- 16.4 무기명 세마포어
- 16.5 기타 동기화 기법과의 비교
- 16.6 세마포어 한도
- 16.7 정리
- 16.8 연습문제
- 17장 POSIX 공유 메모리
- 17.1 개요
- 17.2 공유 메모리 객체 생성
- 17.3 공유 메모리 객체 사용
- 17.4 공유 메모리 객체 제거
- 17.5 공유 메모리 API 비교
- 17.6 정리
- 17.7 연습문제
- 18장 파일 잠금
- 18.1 개요
- 18.2 flock()을 이용한 파일 잠금
- 18.3 fcntl()을 이용한 레코드 잠금
- 18.4 의무 잠금
- 18.5 /proc/locks 파일
- 18.6 프로그램의 하나의 인스턴스만 실행
- 18.7 오래된 잠금 기법
- 18.8 정리
- 18.9 연습문제
- 19장 소켓: 소개
- 19.1 개요
- 19.2 socket() 소켓 생성: socket()
- 19.3 소켓을 주소에 결속하기: bind()
- 19.4 일반적인 소켓 주소 구조: struct sockaddr
- 19.5 스트림 소켓
- 19.6 데이터그램 소켓
- 19.7 정리
- 20장 소켓: 유닉스 도메인
- 20.1 유닉스 도메인 소켓 주소: struct sockaddr_un
- 20.2 유닉스 도메인의 스트림 소켓
- 20.3 유닉스 도메인의 데이터그램 소켓
- 20.4 유닉스 도메인 소켓 접근 권한
- 20.5 연결된 소켓 쌍 생성: socketpair()
- 20.6 리눅스 추상 소켓 네임스페이스
- 20.7 정리
- 20.8 연습문제
- 21장 소켓: TCP/IP 네트워크 기초
- 21.1 인터넷
- 21.2 네트워킹 프로토콜과 계층
- 21.3 데이터 링크 계층
- 21.4 네트워크 계층: IP
- 21.5 IP 주소
- 21.6 전송 계층
- 21.7 RFC(Requests for Comments)
- 21.8 정리
- 22장 소켓: 인터넷 도메인
- 22.1 인터넷 도메인 소켓
- 22.2 네트워크 바이트 순서
- 22.3 데이터 표현
- 22.4 인터넷 소켓 주소
- 22.5 호스트와 서비스 변환 함수
- 22.6 함수 inetpton()과 inetntop()
- 22.7 클라이언트/서버 예제(데이터그램 소켓)
- 22.8 DNS(Domain Name System)
- 22.9 /etc/services 파일
- 22.10 프로토콜 독립적인 호스트와 서비스 변환
- 22.11 클라이언트 서버 예제(스트림 소켓)
- 22.12 인터넷 도메인 소켓 라이브러리
- 22.13 더 이상 사용하지 않는 호스트와 서비스 변경 API
- 22.14 유닉스 소켓과 인터넷 도메인 소켓
- 22.15 더 읽을거리
- 22.16 정리
- 22.17 연습문제
- 23장 소켓: 서버 설계
- 23.1 반복 서버와 병렬 서버
- 23.2 반복 UDP 에코 서버
- 23.3 병렬 TCP 에코 서버
- 23.4 다른 병렬 서버 설계
- 23.5 inetd(인터넷 슈퍼서버) 데몬
- 23.6 정리
- 23.7 연습문제
- 24장 소켓: 고급 옵션
- 24.1 스트림 소켓에서 부분 읽기와 부분 쓰기
- 24.2 shutdown() 시스템 호출
- 24.3 소켓 전용 I/O 시스템 호출: recv()와 send()
- 24.4 sendfile() 시스템 호출
- 24.5 소켓 주소 가져오기
- 24.6 TCP에 대한 고찰
- 24.7 소켓 모니터링: netstat
- 24.8 tcpdump를 이용한 TCP 트래픽 감시
- 24.9 소켓 옵션
- 24.10 SO_REUSEADDR 소켓 옵션
- 24.11 accept()를 통한 Flags와 Options 상속
- 24.12 TCP와 UDP
- 24.13 고급 기능
- 24.14 정리
- 24.15 연습문제
- 25장 터미널
- 25.1 개요
- 25.2 터미널 속성값 읽기와 수정
- 25.3 stty 명령
- 25.4 터미널 특수문자
- 25.5 터미널 플래그
- 25.6 터미널 I/O 모드
- 25.7 터미널 라인 속도(비트 전송률)
- 25.8 터미널 라인 제어
- 25.9 터미널 윈도우 크기
- 25.10 터미널 식별
- 25.11 정리
- 25.12 연습문제
- 26장 대체 I/O 모델
- 26.1 개요
- 26.2 I/O 멀티플렉싱
- 26.3 시그널 기반 I/O
- 26.4 epoll API
- 26.5 시그널과 파일 디스크립터 기다리기
- 26.6 정리
- 26.7 연습문제
- 27장 가상 터미널
- 27.1 개요
- 27.2 유닉스 98 가상 터미널
- 27.3 마스터 열기: ptyMasterOpen()
- 27.4 프로세스를 가상 터미널과 연결: ptyFork()
- 27.5 가상 터미널 I/O
- 27.6 스크립트(1) 구현
- 27.7 터미널 속성과 윈도우 크기
- 27.8 BSD 가상 터미널
- 27.9 정리
- 27.10 연습문제
- 부록 A 연습문제 해답
- [리눅스 API의 모든 것 Vol. 1 기초 리눅스 API 목차]
- 1장 역사와 표준
- 2장 기본 개념
- 3장 시스템 프로그래밍 개념
- 4장 파일 I/O: 범용 I/O 모델
- 5장 파일 I/O: 더 자세히
- 6장 프로세스
- 7장 메모리 할당
- 8장 사용자와 그룹
- 9장 프로세스 자격증명
- 10장 시간
- 11장 시스템 한도와 옵션
- 12장 시스템과 프로세스 정보
- 13장 파일 I/O 버퍼링
- 14장 파일 시스템
- 15장 파일 속성
- 16장 확장 속성
- 17장 ACL
- 18장 디렉토리와 링크
- 19장 파일 이벤트 감시
- 20장 시그널: 기본 개념
- 21장 시그널: 시그널 핸들러
- 22장 시그널: 고급 기능
- 23장 타이머와 수면
- 24장 프로세스 생성
- 25장 프로세스 종료
- 26장 자식 프로세스 감시
- 27장 프로그램 실행
- 28장 더 자세히 살펴보는 프로세스 생성과 프로그램 실행
- 29장 프로세스 그룹, 세션, 작업 제어
- 30장 프로세스 우선순위와 스케줄링
- 31장 프로세스 자원
- 32장 데몬
- 33장 안전한 특권 프로그램 작성
- 34장 능력
- 35장 로그인 계정
- 36장 공유 라이브러리 기초
- 37장 공유 라이브러리의 고급 기능
도서 오류 신고
정오표
정오표
2016. 11. 16 수정 사항
[p.585: 아래에서 8행]
addrStr[addrStrLen - 1]
= '\0;'
->
addrStr[addrStrLen - 1]
= '\0';
[p.340 : 2행]
메모로 보호
->
메모리 보호
[p.340 : 6행]
하지만 읽기 오퍼레이션은 OWRONLY와 호환되지 않기 때문에 원본 파일의 내용을 보여주지 말아야 한다.
->
하지만 읽기 오퍼레이션은 원본 파일의 내용을 보여주지 않는 OWRONLY와 호환되지 않는다.
[p.340 : 13행]
이는 논리적으로 PROTWRITE이기 때문에 MAPSHARED는 매핑된 파일에 갱신을 허가한다.
->
이는 PROTWRITE, MAPSHARED 매핑이 매핑된 파일의 갱신을 허용한다는 측면에서 논리적이라 할 수 있다.