목 차

The GNU C Library

목 차

1  안내문	1

1.1  시작하기	1

1.2  표준규정과 호환성	1

1.2.1  안시 씨	1

1.2.2  POSIX ( 이식가능한 운영체제와의 호환성 ; The Portable Operating                          System Interface )	2

1.2.3  버클리 유닉스	2

1.2.4  SVID ( V체제 호환성 설명 )	2

1.3  라이브러리 사용하기	3

1.3.1  헤더 파일	3

1.3.2  함수의 매크로 정의	4

1.3.3  예약된 명칭들	4

1.3.4  Feature Test Macros	5

1.4  안내서의 지도	7

2  에러 보고	9

2.1  에러 체크	9

2.2  에러 코드	10

2.3  에러 메시지	16

3  메모리 할당	19

3.1  동적 메모리 할당이란?	19

3.2  동적할당과 C	19

3.3  자유로운 할당	20

3.3.1  메모리 할당의 기초	20

3.3.2  malloc의 예제들	20

3.3.3  malloc에 의해 할당된 메모리 해제하기	21

3.3.5  깨끗한 공간 할당하기	22

3.3.6  malloc을 위한 효율적인 조치	22

3.3.7  잘 정돈된 메모리 블럭 할당하기	23

3.3.8  메모리 힙의 일관성 체크하기	23

3.3.9  저장소 할당 hook들	23

3.3.10  malloc으로 할당한 저장소 통계	24

3.3.11  malloc 관련 함수 요약	25

3.4  Obstacks	26

3.4.1  Obstacks 만들기	26

3.4.2  Obstack들은 사용하기 위한 준비	27

3.4.3  Obstack에서 할당	27

3.4.4  Obstack에서 Objects 해제하기	28

3.4.5  Obstack 함수와 매크로	28

3.4.6  성장하는 대상물	29

3.4.7  특히 급속하게 성장하는 대상물	30

3.4.8  obstack의 위상	31

3.4.9  obstack에서의 데이터 할당	32

3.4.10  obstack 덩어리	32

3.4.11  obstack 함수 요약	33

3.5  다양한 크기로의 자동저장	35

3.5.1  alloca 예	35

3.5.2  alloca를 이용해서 얻는 이득	36

3.5.3  alloca의 단점	36

3.5.4  GNU C 변할수 있는 크기의 배열	37

3.6  재조정 할당자	37

3.6.1  재조정 할당자의 개념	37

3.6.2  재조정가능한 블럭의 할당과 해제	37

3.7  메모리 사용 경고	38

4  문자 다루기	39

4.1  문자들의 분류	39

4.2  변환	40

5  문자열과 배열 유틸리티	43

5.1  문자열의 표현	43

5.2  문자열과 배열 규정	44

5.3  문자열 길이	44

5.4  (문자열) 복사와 결합	44

5.5  문자열/배열 비교	47

5.6  대조 함수들	49

5.7  탐색 함수들	51

5.8  문자열에서 토큰 찾기	52

6  입출력 개요	55

6.1  입출력의 개념	55

6.1.1  스트림과 파일지시자	55

6.1.2  파일 위치	56

6.2  파일 명칭	56

6.2.1  디렉토리	57

6.2.2  파일 명칭 분석	57

6.2.3  파일 명칭 에러	58

6.2.4  파일명칭의 운용	58

7  스트림에서의 입/출력	61

7.1  스트림	61

7.2  표준 스트림	61

7.3  스트림 열기	62

7.4  스트림 닫기	63

7.5  문자들이나 라인의 간단한 출력	64

7.6  문자 입력	64

7.7  라인 단위 입력	65

7.8  읽지 않기	67

7.8.1  Unreading이란 무슨 의미인가	67

7.8.2  Unreading 하기 위해 ungetc를 이용하기	67

7.9  형식화된 출력	68

7.9.1  형식화된 출력의 기본사항	68

7.9.2  출력 변환 문장	69

7.9.3  출력 변환자 테이블	70

7.9.4  정수 변환자	70

7.9.5  부동소수점 변환자	72

7.9.6  여타의 출력 변환자	73

7.9.7 형식화된 출력 함수	74

7.9.8  동적으로 할당하는 형식화된 출력	75

7.9.9  다양한 인수들을 출력하는 함수들	75

7.9.10  템플릿 스트링 파싱	77

7.9.11  템플릿 스트링 파싱의 예	78

7.10  printf 주문하기	79

7.10.1  새로운 변환 등록하기	79

7.10.2  변환 지시자 옵션들	79

7.10.3  출력 핸들러 정의하기	80

7.10.4  printf 확장 예제	81

7.11  형식화된 입력	82

7.11.1  형식화된 입력의 기초	82

7.11.2  입력 변환자 문장	83

7.11.3  입력 변환자 테이블	83

7.11.4 수치 입력 변환자	84

7.11.5  문자열 입력 전환들	85

7.11.6  동적으로 할당하는 문자열 전환들.	86

7.11.7  다른 입력 전환들.	86

7.11.8  형식화된 입력 함수들.	87

7.11.9  변수 인수들의 입력 함수들.	87

7.12  블록 입력/출력	87

7.13  파일의 끝과 에러들.	88

7.14  텍스트와 바이너리 스트림.	89

7.15  파일 위치시키기	89

7.16  호환성 있는 파일-위치 함수들	91

7.17  스트림 버퍼링	92

7.17.1  버퍼링 개념들	92

7.17.2  버퍼를 쏟아내기	92

7.17.3  버퍼링의 종류 제어하기	93

7.18  다른 종류의 스트림	94

7.18.1  문자열 스트림	95

7.18.2  Obstack 스트림	96

7.18.3  프로그래밍한 당신 자신만의 주문 스트림	97

7.18.3.1  주문 스트림과 Cookies	97

7.18.3.2  주문 스트림 후크 함수들	98

8  저 수준 입/출력	99

8.1  파일 열고 닫기	99

8.2  기본 입력과 출력	101

8.3  기술자의 파일 위치 설정하기	103

8.4  기술자와 스트림	104

8.5  스트림과 기술자 혼용의 위험	105

8.5.1  연결된 채널들	105

8.5.2  독립적 채널들	106

8.5.3  채널 깨끗이 하기	106

8.6  입력이나 출력을 위한 기다림	107

8.7  파일에서의 제어 명령들	109

8.8  기술자 복제하기	110

8.9  파일 기술자 플래그	111

8.10  파일 상황 플래그들	112

8.11  파일 록	114

8.12  인터럽트로 조종된 입력	116

9  파일 시스템 인터페이스	119

9.1  작업 디렉토리	119

9.2  디렉토리 억세스하기	120

9.2.1  디렉토리 엔트리의 형식	120

9.2.2  디렉토리 스트림 개방하기	121

9.2.3  디렉토리 스트림 읽고 닫기	121

9.2.4  디렉토리의 파일을 리스트하는 간단한 프로그램	122

9.2.5  디렉토리 스트림의 랜덤 억세스.	122

9.3  하드 링크	123

9.4  심볼릭 링크	124

9.5  파일 지우기	125

9.6  파일 재명명하기	125

9.7  디렉토리 만들기	127

9.8  파일 속성들	127

9.8.1  파일 속성들의 값이 무엇을 의미하는가	127

9.8.2  파일 속성들 읽기	129

9.8.3  파일의 형식 알아보기	130

9.8.4  파일 소유자.	131

9.8.5  파일 접근 허가 비트들	133

9.8.6  어떻게 파일에 당신의 접근을 결정하는가	134

9.8.7  파일 접근 허가 정하기	134

9.8.9  파일에 관련된 시간들	137

9.9  특수 파일 만들기	138

9.10  임시 파일들	138

10  파이프 와 FIFO	141

10.1  파이프 만들기	141

10.2  부프로세스를 위한 파이프	142

10.3  FIFO 특별한 파일들	143

10.4  파이프 입/출력의 원소수	144

11  소켓	145

11.1  소켓 개념	145

11.2  통신스타일	146

11.3  소켓 주소	146

11.3.1  주소 포맷	147

11.3.2  소켓의 주소를 세팅하기	148

11.3.3  소켓의 주소 읽기	148

11.4  The File Namespace	148

11.4.1  파일 이름공간 개념들	149

11.4.2  파일이름 공간의 자세한 것	149

11.4.3  파일-이름공간 소켓의 예	150

11.5  인터넷 이름공간	150

11.5.1  인터넷 소켓 주소 포맷	151

11.5.2  호스트 주소	151

11.5.2.1  인터넷 호스트 주소	151

11.5.2.2  호스트 주소 자료형	152

11.5.2.3  호스트 주소 함수들	153

11.5.2.4  호스트 이름들	153

11.5.3  인터넷 포트	155

11.5.4  서비스 데이터베이스	156

11.5.5  바이트순서 변환	157

11.5.6  프로토콜 데이터베이스	158

11.5.7  인터넷 소켓 예제	159

11.6  다름 이름공간들	160

11.7  소켓 열고 닫기	160

11.7.1  소켓 만들기	160

11.7.2  소켓 닫기	161

11.7.3  소켓 쌍	161

11.8  연결하는데 소켓사용	162

11.8.1  연결 만들기	162

11.8.2  연결 듣기	163

11.8.3  연결 수락	163

11.8.4  누가 나에게 연결되어 있나	164

11.8.5  데이터 전송	164

11.8.5.1  데이터 보내기	164

11.8.5.2  데이터 수신하기	165

11.8.5.3  소켓 데이터 옵션	165

11.8.6  Byte Stream 소켓 예제	166

11.8.7  Byte Stream Connection 서버 예제	167

11.8.8  Out-of-Band 데이타	168

11.9  데이터그램 소켓 명령	170

11.9.1  데이터그램 전송	171

11.9.2  데이터그램 수신	171

11.9.3  데이터그램 소켓 예제	171

11.9.4  데이터그램 읽기 예제	172

11.10  inetd 데몬	173

11.10.1  inetd 서버들	173

11.10.2  inetd 설정	174

11.11  소켓 옵션	174

11.11.1  소켓 옵션 함수	174

11.11.2  소켓-레벨 옵션	175

11.12  네트워크 데이터베이스	176

12  저수준 터미날 인터페이스	179

12.1  터미날 확인하기	179

12.2  입/출력 큐	179

12.3  입력의 두가지 스타일: Canonical 또는 Not	180

12.4  터미널 모드	180

12.4.1  터미날 모드 데이터 타입들	180

12.4.2  터미날 모드 함수들	181

12.4.3  적당하게 터미날 모드 설정하기	182

12.4.4  입력 모드들	183

12.4.5  출력 모드들	184

12.4.6  제어 모드들	185

12.4.7  국소 모드들	186

12.4.8  라인 속도	188

12.4.9  특별 문자들	189

12.4.9.1  입력 편집을 위한 문자들	190

12.4.9.2  편집 문자의 BSD 확장	190

12.4.9.3  신호를 발생시키는 문자들	191

12.4.9.4  흐름 제어를 위한 특별 문자들	192

12.4.9.5  다른 특별 문자들	192

12.4.10  비정규입력	193

12.5  라인 제어 함수들	194

12.6  비정규 모드의 예	195

13  수학 함수	197

13.1  정의구역과 범위 에러들	197

13.2  삼각 함수	197

13.3  역 삼각 함수들	198

13.4  지수함수와 대수	199

13.5  쌍곡선 함수들	200

13.6  의사-난수	200

13.6.1  ANSI C 난수 함수들	201

13.6.2  BSD 난수 함수들	201

14  저 수준 연산 함수들	203

14.1  "숫자가 아닌" 값들	203

14.2  플로트의 술어 ( Predrcates )	203

14.3  절대값	204

14.4  표준화 함수들	204

14.5  라운딩과 나머지 함수들	205

14.6  정수 나누기	206

14.7  숫자의 파싱 ( 구문해석 : parsing )	207

14.7.1  정수의 파싱	207

14.7.2  플로트의 파싱	208

15  탐색과 정렬	211

15.1  비교 함수 정의하기	211

15.2  배열 탐색 함수	211

15.3  배열 정렬 함수	211

15.4  탐색과 정렬의 예	212

16  패턴 매칭 ( Pattern Matching )	215

16.1  와일드카드 매칭 ( Winldcard Matching )	215

16.2  Globbing	216

16.2.1  glob 호출하기	216

16.2.2  Globbing 을 위한 플래그들	217

16.3  정규식 매칭 ( Matching )	218

16.3.1  POSIX 정규식 컴파일	218

16.3.2  POSIX 정규식을 위한 플래그들	219

16.3.3  컴파일된 POSIX 정규식을 매칭하기	220

16.3.4  부표현식 ( Subexpressions ) 과 매치한 결과	220

16.3.5  부표현식 매치하기의 복잡함	221

16.3.6  POSIX Regexp 매치하기 소거	222

16.4  쉘-스타일 단어 확장	222

16.4.1  단어 확장의 단계	222

16.4.2  wprdexp 호출하기	223

16.4.3  단어 확장을 위한 플래그들	224

16.4.4  wordexp Example	225

17  날짜와 시간	227

17.1  프로세서 타임	227

17.1.1  기준 CPU 시간 조사	227

17.1.2  자세하게 경과된 CPU 시간에 대한 조사	228

17.2  달력 시간	228

17.2.1  간단한 달력 시간	229

17.2.2  고해상도 달력	229

17.2.3  Broken-down 시간	231

17.2.4  형식화된 날짜와 시간	232

17.2.5  TZ으로 시간대를 정하기	234

17.2.6  시간대를 위한 함수와 변수들	235

17.2.7  시간 함수들의 예제	235

17.3  알람을 설정하기	236

17.4  Sleeping	238

17.5  자원 사용	238

17.6  제한된 자원 사용	239

17.7  프로세스 우선권	240

18  확장된 문자들	243

18.1  확장된 문자들에 대한 소개	243

18.2  지역과 확장된 문자	243

18.3  다중바이트 문자들	244

18.4  와이드 캐릭터에 대한 안내	245

18.5  확장된 문자열의 변환	246

18.6  다중바이트 문자 길이	247

18.7  일 대 일로 확장된 문자들의 변환	247

18.8  문자 대 문자 변환의 예제	248

18.9  쉬프트 시퀀스들을 사용한 다중바이트 코드들	249

19  지역과 세계화	251

19.1  지역이 가진 효과	251

19.2  지역 선택하기	251

19.3  지역이 미치는 활동의 범주	252

19.4  프로그램은 지역을 어떻게 설정하는가	252

19.5  표준 지역들	254

19.6  숫자의 형식화	254

19.6.1  일반적인 숫자 형식화 파라미터.	254

19.6.2  통화 기호 ( Currency Symbol ) 출력하기	255

19.6.3  금전( Money ) 부호를 프린트하기	256

20  비-지역 탈출	259

20.1  비-지역 탈출들에 대한 안내	259

20.2  비-지역 분기의 상세한 설명	260

20.3  비-지역 분기와 신호	261

21  시그날 처리	263

21.1  시그날들의 기본 원칙	263

21.1.1  시그날들의 종류	263

21.1.2  시그날 발생의 원칙들	263

21.1.3  어떻게 신호들이 배달되는가	264

21.2  표준 시그날들	265

21.2.1  프로그램 에러 시그날들	265

21.2.2  종료 시그날	267

12.2.3  알람 시그날	269

21.2.4  비동기 입/출력 시그날	269

21.2.5  작업 제어 시그날	269

21.2.6  잡다한 시그날	271

21.2.7  비표준 시그날	271

21.2.8  시그날 메세지	272

21.3  시그날 동작 정하기	273

21.3.1  기본 시그날 처리	273

21.3.2  진보된 시그날 처리	275

21.3.3  signal 과 sigaction 의 상호작용	275

21.3.4  sigaction 함수 예제	276

21.3.5  sigaction을 위한 플래그	277

21.3.6  초기 시그날 동작들	277

21.4  시그날 핸들러 정의하기	278

21.4.1  리턴하는 시그날 핸들러	278

21.4.2  프로세스를 종료시키는 핸들러	279

21.4.3  핸들러 안에서 비지역 제어 이동	280

21.4.4  핸들러가 실행되고 있는 동안 도착한 시그날들	281

21.4.5  한가지로 합병한 서로 밀접한 시그날들	281

21.4.6  시그날 핸들링 과 재진입 불가 함수들	283

21.4.7  원소 데이터 억세스와 시그날 핸들링	284

21.4.7.1  비-원자 억세스가 갖는 문제점	285

21.4.7.2  원자 형	285

21.4.7.3  원소단위 사용 형태.	286

21.5  시그날에 의해 인터럽트된 기본동작 ( Primitives )	286

21.6  시그날 발생시키기	287

21.6.1  스스로에게 신호 보내기	287

21.6.2  다른 프로세스에게 시그날 보내기	288

21.6.3  kill을 사용하기 위한 허가	289

21.6.4  통신을 위해서 kill을 사용하기	290

21.7  시그날 블록하기	291

21.7.1  왜 시그날 블록킹 ( Blocking ) 이 유용한가	291

21.7.2  시그날 설정	291

21.7.3  프로세스 시그날 마스크	292

21.7.4  시그날의 배달 여부를 테스트하기 위한 블럭킹	293

21.7.5  핸들러를 위하여 블록된 시그날	294

21.7.6  미해결 시그날 체크하기	294

21.7.7  나중에 동작하도록 시그날을 기억하기	295

21.8  시그날을 위한 기다림	296

21.8.1  pause 사용하기	296

21.8.2  pause 사용의 문제들	297

21.8.3  sigsuspend 사용하기	297

21.9  BSD 시그날 핸들링	298

21.9.1  POSIX 와 BSD 시그날 기능들	298

21.10  핸들러 함수를 만들기 위한 BSD 함수	299

21.10.1  블록된 시그날을 위한 BSD 함수들	300

21.10.2  분리된 시그날 스택 사용하기	300

22  프로세스의 시동과 종료	303

22.1  프로그램 인수들	303

22.1.1  프로그램 인수 구문 관례들	303

22.1.2  프로그램 옵션들을 구문 분석하기	304

22.1.3  getopt를 사용해서 인수를 구문 분석하는 예제	305

22.1.4  긴 옵션들을 구문 분석하기	306

22.1.5  긴 옵션들의 구분분석에 대한 예제	307

22.2  환경 변수들	309

22.2.1  환경 검색	309

22.2.2  표준 환경 변수들	310

22.3  프로그램 종료	311

22.3.1  보통의 종료	311

22.3.2  Exit 상황들	311

22.3.3  종료시의 상황정리	312

22.3.4  프로그램 중지시키기	313

22.3.5  내부적 종료	313

23  프로세스	315

23.1  명령 실행시키기	315

23.2  프로세스 만들기에 대한 원칙	315

23.3  프로세스 식별	316

23.4  프로세스 만들기	316

23.5  파일 실행시키기	317

23.6  프로세스 종료	319

23.7  프로세스 종료 상황들	321

23.8  BSD 프로세스 Wait 함수들	321

23.9  프로세스 만들기 예제	322

24  작업 제어	325

24.1  작업제어의 개념	325

24.2  작업제어는 선택적이다	326

24.3  프로세스의 터미날 제어하기	326

24.4  제어중인 터미날 억세스	326

24.5  고아가된 프로세스 그룹들	327

24.6  작업제어 쉘 실행시키기	327

24.6.1  쉘을 위한 데이터 구조체들	327

24.6.2  쉘 초기화하기	328

24.6.3  작업들을 개시하기	330

24.6.4  전면 과 배경	332

24.6.5  멈추고 종료된 작업들	333

24.6.6  멈추어있는 작업들을계속 실행시키기	335

24.6.7  이 장에서 설명되지 않은 부분들	336

24.7  작업제어를 위한 함수들	336

24.7.1  제어중인 터미날 확인하기	337

24.7.2  프로세스 그룹 함수들	337

24.7.3  제어권을 가진 터미날을 억세스하기 위한 함수들	338

25  사용자와 그룹	341

25.1  사용자와 그룹 ID들	341

25.2  프로세스의 persona	341

25.3  왜 프로세스의 persona를 변경하는가	342

25.4  어떻게 응용프로그램이 persona를 변경할수 있는가	342

25.5  프로세스의 persona 읽기	342

25.6  사용자 ID 설정하기	343

25.7  그룹 ID들을 설정하기	344

25.8  Setuid 억세스를 가능하게 하거나 불가능하게 하기	345

25.9  setuid 프로그램 예제	345

25.10  setuid 프로그램을 만들기 위한 팁	347

25.11  누가 로그인 했는지 확인하기	348

25.12  사용자 데이타베이스	348

25.12.1  사용자의 정보를 담고 있는 데이터 구조체	348

25.12.2  한명의 사용자에대해 자세히 알아보기	349

25.12.3  모든 사용자 리스트를 검색하기	349

25.12.4  사용자 엔트리를 기록하기	350

25.13  그룹 데이터 베이스	350

25.13.1  그룹을 위한 데이터 구조체	350

25.13.2  한 개의 그룹에 대한 상세한 정보를 알아내기	350

25.13.3  모든 그룹에 대한 리스트를 검색하기	351

25.14  사용자와 그룹 데이터베이스에 대한 예제	351

26  시스템 정보	353

26.1  호스트 확인	353

26.2  하드웨어/소프트웨어 타입 확인하기	354

27  시스템 구성 파라미터	355

27.1  일반적인 용량 제한	355

27.2  포괄적인 시스템 옵션들	356

27.3  지원되는 POSIX의 버젼은?	357

27.4  sysconf 사용하기	357

27.4.1  sysconf의 정의	358

27.4.2  sysconf의 parameter를 위한 상수들	358

27.4.3  sysconf의 예제	359

27.5  총괄적인 용량 제한들을 위한 최소값	360

27.6  파일 시스템 용량의 제한	360

27.7  파일에 지원되는 선택적 기능들	362

27.8  파일 시스템 제한을 위한 최소값들	362

27.9  pathconf 사용하기	363

27.10  유틸리티 프로그램 용량 제한들	364

27.11  유틸리티 제한들을 위한 최대값	365

27.12  문자열-평가 파라미터들	365

부록 A  라이브러리에 있는 C 언어 기능들	367

A.1  내부적 일관성을 명백하게 테스트하기	367

A.2  가변인자 함수들	368

A.2.1  왜 가변인자 함수들이 사용되는가?	368

A.2.2  어떻게 가변인자 함수를 정의하고 사용하는가?	368

A.2.2.1  가변 인수들을 위한 구문	368

A.2.2.2  인수 값들을 받기	369

A.2.2.3  어떻게 많은 인수들이 공급되는가?	369

A.2.2.4  가변인수 함수들을 호출하기	370

A.2.2.5  인수 억세스 매크로들	370

A.2.3  가변인수 함수의 예제	371

A.2.3.1  오래된-형태의 가변인수 함수들	371

A.3  널 포인터 상수	372

A.4  중요한 데이터 타입들	372

A.5  데이터 타입 측정	373

A.5.1  정수 테이타 타입의 너비 계산하기	373

A.5.2  정수 타입의 범위	374

A.5.3  부동형 매크로들	375

A.5.3.1  플로팅 포인트 표기 개념	375

A.5.3.2  플로팅 포인트 파라미터들	376

A.5.3.3  IEEE 플로팅 포인트	378

A.5.4  구조체 필드 옵셋 ( offset ) 측정	379

부록 B  라이브러리 기능들의 요약	381

부록 C  라이브러리 유지보수	383

C.1  어떻게 GNU C 라이브러리를 인스톨할것인가?	383

C.2  버그들을 보고하기	385

C.3  새로운 함수들을 더하기	386

C.4  GNU C Library 포팅하기	387

C.4.1  `sysdeps' 디렉토리 계층의 배치	389

C.4.2  GNU C 라이브러리를 Unix 시스템들로 포팅하기	391

C.5  GNU C 라이브러리의 공헌자	391

부록 D  GNU LIBRARY GENERAL PUBLIC                  LICENSE	395

서론	395

복제, 배포 와 수정에 대한 제한과 조건	396

부록 E  뒷 얘기	403

E.1  역자 후기	403

E.1.1  김소영(flpigy)	403

E.1.2  조원봉 (thirnine)	404

E.1.3  고석갑 (sukgab)	406

E.2  편집 후기	406

E.2.1  1차 편집 후기	406

E.2.2  2차 편집 후기	408