본문 바로가기

오탈자 정보

[사물인터넷을 위한 리눅스 프로그래밍 with 라즈베리 파이(전면개정판)]_오탈자

현재까지 발견된 위 책의 오탈자 정보와 오류, 그리고 보다 매끄러운 문장을 위해 수정한 내용을 알려드리며, 아울러 집필과 편집 시에 미처 확인하지 못하고 불편을 끼쳐 죄송하다는 말씀을 드립니다. 아래의 오탈자 사항은 추후 재쇄 시에 반영하도록 하겠습니다. 

이외의 오탈자 정보를 발견하시면 도서 커뮤니티(http://www.facebook.com/groups/LinuxProgrammingWithRaspberryPi)나 출판사(help@jpub.kr)로 연락을 주시면 고맙겠습니다.

 

최종수정일자: 2023년 8월 4일
1-3쇄본 오탈자

앞표지 날개 저자 이메일
valetntis@gmail.com => valentis@gmail.com

265쪽 표 5-12의 RMLIMIT_CPU에서 
초 단위의 CPU 시간 

==>

프로세스가 소비할 수 있는 최대 CPU 시간(초 단위)

 

265쪽 표 5-12의 RMLIMIT_DATA에서 
최대 데이타 크기 ==> 최대 데이터 크기

274쪽 그림 5-17에서
'하위 8비트'와 '상위 8비트' 텍스트 위치 변경, 즉 '하위 8비트'가 왼쪽으로 가야 함

285쪽 코드 5-8 가운데 부분 주석에서
/* 쓰기를 위한 파일 디스크립터를 표준 출력(1)으로 변경 */
==>
/* 표준 출력(1)을 쓰기를 위한 파일 디스크립터(pfd[1])로 변경 */

498쪽 아래에서 5번째 줄에서
for(J = 0; j < vinfo.xres *2; j += colors) {

==>

for(j = 0; j < vinfo.xres *2; j += colors) {

510 밑에서 4번째 줄에서
사용하기 한다. ==> 사용하기도 한다.

554쪽 마지막 줄에서
Open EGL/OpenMAX 등의
==>
OpenEGL/OpenMAX 등의

896쪽 두 번째 코드 박스 1행에서
./hellloneon ==> ./calculation

897쪽 코드 13-17의 4행에서(빈 행 제외)
extern readBmp(char *filename, ubyte **pData, int cols, int *rows, int *color);
==>
extern readBmp(char *filename, ubyte **pData, int cols, int *rows);

 

897쪽 코드 13-17의 밑에서 7번째 행에서(빈 행 제외)
if(readBmp(argv[1], &pImageData, &cols, &rows, &color) < 0) {
==>
if(readBmp(argv[1], &pImageData, &cols, &rows) < 0) {

898쪽 코드 13-18의 12번째 행에서
for(int i = 0; i < n; i++) {
==>

for(int i = 0; i < n; i+=8) {


899쪽 두 번째 문단 1행에서
vmull_u8( ), vmlal_u8( ), vmlal_u8( ) 함수를 이용해서 
==>
vmull_u8( ), vmlal_u8( ) 함수를 이용해서 

900쪽 맨 위 공식 박스에서
세 줄 모두 제일 마지막 '/ 28'에서 8을 위첨자로 변경해야 함

178쪽 표 4-2의  dup( ) 행에서

복사한다. ==> 복제한다.

185쪽 표 4-6 제목에서 

fnctl( ) 함수의 옵션 ==> fcntl( ) 함수의 옵션

 

185쪽 표 4-6 F_DUFOD 내용 항목에서
파일 디스크립터를 복사할 때 사용되며,

==>

파일 디스크립터를 복제할 때 사용되며,

185쪽 표 4-7 제목에서 

fnctl( ) 함수의 잠금 타입 ==> fcntl( ) 함수의 잠금 타입


192쪽 코드 4-2 아래에서 7번째 줄

while ((n = fread (buf, sizeof(char), BUFSIZ, in)) > 0)

==>

while ((n = fread(buf, sizeof(char), BUFSIZ, in)) > 0)

201쪽 상단 코드 박스에서

int rename (const char *oldpath , const char *newpath );
==>
int rename(const char *oldpath , const char *newpath );

212쪽 3행에서

S_SIUID를 지정해놓으면

==>

S_ISUID를 지정해놓으면


259쪽 3행에서
프로세스를 종료한다. ==> 프로세스를 종료하는 것이다.

351쪽 두 번째 문단 1행에서

포트 번호는 16진수이므로

==>

포트 번호는 16비트이므로

359쪽 코드 6-4에서

아래에서 3번 줄의 'int n;'을 삭제해야 함

514~520 페이지 소스 코드 8-2 8-3 8-4 8-5 8-6에서
'cv::Scalar'를 모두 'Scalar'로 변경해야 함

517쪽 코드 8-4의 6행에서(빈 행 제외)

518 페이지
흰색 배경의 행렬을 생성한다. ==> 검은색 배경의 행렬을 생성한다.

 

518쪽 코드 8-5의 6행에서(빈 행 제외)

흰색 배경의 행렬을 생성한다. ==> 검은색 배경의 행렬을 생성한다.

 

888쪽 상단 코드 박스 1행에서

ubuntu:~ $ ubuntu:~$ gst-launch-0.10 -v rtspsrc location="rtsp://라즈베리_파이의_

==>

ubuntu:~ $ gst-launch-0.10 -v rtspsrc location="rtsp://라즈베리_파이의_


90쪽 두 번째 문단 1-2행에서(kjinhng님 제보)

all이나 clean은 실제로 존재하는 파일이 아니기 때문에 실제로 해당 파일이 없으면 문제가 발생할 수 있다.
==>
all이나 clean은 실제로 존재하는 파일이 아니기 때문에 실제로 해당 파일이 있으면 문제가 발생할 수 있다.

 

7쪽  1-1의 라즈베리 파이 가격과 메모리

$35/$45/$55 ==> $35/$55/$75

1GB/2Gb/4GB ==> 2GB/4GB/8GB

 

12쪽 위에서 일곱 번째 줄

35달러(1기가)/45달러(2기가)/55달러(4기가) ==> 35달러(2기가)/55달러(4기가)/75달러(8기가)

 

12  1-2 라즈베리 파이 4B 칸

1/2/4GB @ 2400MHz ==>  2/4/8GB @ 2400MHz

 

47쪽 위에서 4번째 줄

라즈베리 파이는 $5부터 $35/45/55 아주 저렴한 가격에 구매가 가능하며

==>

라즈베리 파이는 $5부터 $35/$55/$75 아주 저렴한 가격에 구매가 가능하며

 

96쪽 그림 2-15

동적 메모리 영역 (* 해당 텍스트를 heap 옆으로 이동)

 

116쪽 그림 3-10 제목 수정

그림 3-10 다양한 커넥터들 ==> 그림 3-10 점프 케이블과 다양한 커넥터들

 

127쪽 제일 윗줄 코드상의 sudo 삭제

pi@raspberrypi:~ $ sudo ./wiringled 1 ==> pi@raspberrypi:~ $ ./wiringled 1

 

140쪽 그림 3-34 제목 순서 변경

그림 3-34 DC 모터스태핑 모터서보 모터, AC 모터 ==> 그림 3-34 DC 모터스태핑 모터, AC 모터, 서보 모터

 

143쪽 중간 코드문의 sudo 삭제

pi@raspberrypi:~ $ sudo ./wiringmotor 2

==>

pi@raspberrypi:~ $ ./wiringmotor 2

 

160쪽 세 번째 문단 수정

스펙 문서를 보면 압력의 출력값을 위한 PRESS_OUT_XL과 PRESS_OUT_L, PRESS_OUT_H 등의 값을 살펴보면 28h, 29h, 2Ah 등의 주소를 사용하는 것을 확인할 수 있다. 이 문서를 이용해서 레지스터의 주소를 정리해보면 다음 코드와 같이 나타낼 수 있다.

==>

스팩 문서를 보면 습도와 온도의 출력값을 위한 H_T_OUT_L, H_T_OUT_H, TEMP_OUT_L, TEMP_OUT_H 등의 값을 살펴보면 28h, 29h, 2Ah, 2Bh 등의 주소를 사용하는 것을 확인할  있다 문서를 이용해서 레지스터의 주소를 정리해보면 다음의 코드와 같이 나타낼  있다.

 

166쪽 소스 코드 잘못된 부분 수정

        getAccel(acc_fd, &ax, &ay, &az);
        printf("Accelerator : %d, %d, %d\n", ax, ay, ax);
                     
        getGyro(acc_fd, &gx, &gy, &gz);
        printf("Gyro : %d(pitch), %d(roll), %d(yaw)\n", gx, gy, gx);
==>
        getAccel(acc_fd, &ax, &ay, &az);
        printf("Accelerator : %d, %d, %d\n", ax, ay, az);
                     
        getGyro(acc_fd, &gx, &gy, &gz);
        printf("Gyro : %d(pitch), %d(roll), %d(yaw)\n", gx, gy, gz);

 

167쪽 제일 아래 코드 박스의 내용 수정. 제일 윗부분은 기존의 서식(볼드체지정

pi@raspberrypi ~ $ gcc -o accelerometer accelerometer.c -lwiringPi
pi@raspberrypi ~ $ ./accelerometer
Accelerator : -1150, -127 ,15807
Gyro : 65427(pitch), 53(roll), 65502(yaw)
magnetic : 2638, 1470, -3414
Accelerator : -1160, -145 ,15827
Gyro : 65429(pitch), 54(roll), 65503(yaw)
magnetic : 2638, 1470, -3414
/* ~ 중간 표시 생략 ~ */
Accelerator : -1157, -101 ,15873
Gyro : 65430(pitch), 54(roll), 65506(yaw)
magnetic : 2621, 1484, -3456

 

178  4-2 추가

함수                                        내용                                                          비고

sync( )            변경된 캐쉬(cache/buffer) 바로 비운다/출력한다.         fsync( ) fdatasync( )

 

273쪽 위에서 10번째 줄 

좀비 프로세서(zombie)라고 한다. ==> 좀비(zombie)프로세서라고 한다.

 

274쪽 그림 5-17 그림상의 텍스트

* 상위 8비트 / 하위 8비트 텍스트 위치를 서로 맞바꿉니다.

 

280 posix_spawn() 함수 절 제목

posix_spawn( )  (* 괄호 사이에 반공백 문자 삽입)

 

285 코드 5-8

execl("/bin/date", "date", 0); ==> execl("/bin/date", "date", NULL);   (* execl( ) 함수의 세 번째 인자를 0에서 NULL 변경)

더보기

#include <stdio.h>                  /* printf( ) 함수를 위해 사용 */

#include <unistd.h>

#include <sys/wait.h>                              /* waitpid() 함수를 위해 사용 */

 

int main(int argc, char **argv)

{

    pid_t pid;

    int pfd[2];

    char line[BUFSIZ];                                 /* <stdio.h> 파일에 정의된 버퍼 크기로 설정 */

    int status;

 

    if(pipe(pfd) < 0) {                  /* pipe( ) 함수를 이용해서 파이프 생성 */

        perror("pipe()");

        return -1;

    }

 

    if((pid = fork()) < 0) {            /* fork( ) 함수를 이용해서 프로세스 생성 */

        perror("fork()");

        return -1;

    } else if(pid == 0) {                /* 자식 프로세스인 경우의 처리 */

        close(pfd[0]);                    /* 읽기를 위한 파일 디스크립터 닫기 */

        dup2(pfd[1], 1);                /* 쓰기를 위한 파일 디스크립터를 표준 출력(1)으로 변경 */

        execl("/bin/date", "date", NULL);                    /* date 명령어 수행 */

        close(pfd[1]);                    /* 쓰기를 위한 파일 디스크립터 닫기 */

        _exit(127);

    } else {                                   /* 부모 프로세스인 경우의 처리 */

        close(pfd[1]);                    /* 쓰기를 위한 파일 디스크립터 닫기 */

        if(read(pfd[0], line, BUFSIZ) < 0) {    /* 파일 디스크립터로부터 데이터 읽기 */

            perror("read()");

            return -1;

        }

        printf("%s", line);             /* 파일 디스크립터로부터 읽은 내용을 화면에 표시 */

        close(pfd[0]);                    /* 읽기를 위한 파일 디스크립터 닫기 */

        waitpid(pid, &status, 0);                  /* 자식 프로세스의 종료를 기다리기 */

    }

 

    return 0;

 

286쪽 위에서 네 번째 

dup( ) 함수를 이용하여 표준 출력(1)...

==>

dup2( ) 함수를 이용하여 표준 출력(1)...

 

298쪽 코드 들여쓰기

(* '/* 손님이 일어나면 남은 식탁의 수를 증가 */' 주석을 /아래에 주석과 들여쓰기 맞추기)

 

313~314쪽 따라 하기 코드 박스

ptheadV ==> pthreadV

ptheadP ==> pthreadP

 

315쪽 아래서 두 번째 

경쟁 조건(Race condition)  ==> 경쟁 상태(Race condition)

 

333~345쪽 하단 쪽 번호

5.6 네트워크의 개요와 BSD 소켓 ==> 6.1 네트워크의 개요와 BSD 소켓

 

339쪽 10 11 각주의 설명을 서로 맞바꿈

(* 두 개의 각주가 바뀌었습니다10 각주는 11번을 위한 것이고 11 각주는 10번을 위한 것입니다.)

 

346쪽 위에서 여섯 번째 서식 변경

(* stdio(0)가 이후 글자와 크기가 같아야 함)

 

352페이지 : 6-2에서 두번째 getnameinfo( ) getaddrinfo( ) 변경

getaddrinfo( ) IP 주소로부터 도메인 주소를 구한다. 최신의 DNS 서버는 보안 문제로 Reverse DNS 기능을 지원하기 않기 때문에 getnameinfo( ) 함수가 제대로 동작하지 않을 수 있다. gethostbyaddr( ), getservbyport( )
 
353쪽 코드 사이에 공백 추가(아래서 두 번째 줄)

int sockfd,n; --> int sockfd, n;

 

96쪽 그림 2-15의 좌측 밑에서 두 번째 네모 박스에 텍스트 누락
.text(code)

96쪽 그림 2-15의 좌측 밑에서 다섯 번째 네모 박스 우측에 텍스트 누락
malloc( ) 등의 메모리 할당 함수 사용 시

 

최종수정일자: 2020년 3월 16일
1쇄본 오탈자

796쪽 세 번째 코드 박스의 2행에서(윤O필 님 제보)
pi@raspberrypi:/usr/src/linux $ sudo cp ./arch/arm/boot/zImage /boot/kerne7l.img
==> 
pi@raspberrypi:/usr/src/linux $ sudo cp ./arch/arm/boot/zImage /boot/kernel7l.img