Issuu on Google+


Статические и динамические библиотеки

8

ǹȓȑȘȜ ȕȎȚȓțȭȓȚȩȗ ȘȜȒ , .

ɫɨɛɫɬɜɟɧɧɨɦ

.

,

. .

, .

, ,

388 390 ?

391 392

.o

393 394 ar…

395

,

396 Head First

401 402

405 …

406 408 ?

409

-

411

410 423 ǬȋȢȐ, ȐȗȎȄ, ȐȄȕȏȒ, ȄȑțȒȗȕȟ…

ņśŗ Řśőşʼn? ņśŗ ŚʼnŕŗŔŎś? ĶŎś, Ŧśŗ ŘŎřŎŕŎŢʼnŎŕŤŒ ŗŊţŎœśŖŤŒ ŝʼnŒŔ Ś ŕŎśʼnōʼnŖŖŤŕő.

17


Лабораторная работа 2

OpenCV Представьте, что компьютер в ваше отсутствие может присматривать за домом и сообщать о подозрительных личностях, которые бродят вокруг. В лабораторной работе 2 вы создадите детектор для обнаружения незваных гостей, используя возможности возможн языка Си и мастерство OpenCV.

18

ɨɝɥɚɜɥɟɧɢɟ


Процессы и системные вызовы

9

ǾȎȕȞȡȦȎȭ ȑȞȎțȖȤȩ

. , ɜɵɡɵɜɚɬɶ ɞɪɭɝɢɟ

. ɩɪɨɝɪɚɦɦɵ

? ɩɪɨɰɟɫɫɨɜ

.

ɷɥɟɤɬɪɨɧɧɨɣ ɩɨɱɬɟ, ɛɪɚɭɡɟɪɭ

ɥɸɛɨɦɭ

ɭɫɬɚɧɨɜɥɟɧɧɨɦɭ ɜɧɟɲɧɟɦɭ ɩɪɢɥɨɠɟɧɢɸ. ɡɚ ɪɚɦɤɢ ɹɡɵɤɚ ɋɢ. — 434 -

438 439 exec()

440 exec()

441

— execv(), execvp(), execve()

442 443 444 RSS

452

exec() —

ņśŗ ŘřŗşŎŚŚ newshound.

456 fork() + exec()

457 463

ķŖ ŐʼnŘŜŚœʼnŎś Řŗ ŗśōŎŔťŖŗŕŜ ŘřŗşŎŚŚŜ ōŔŨ œʼnŏōŗŌŗ őŐ śřŎŞ ŖŗŋŗŚśŖŤŞ Řŗśŗœŗŋ.

newshound

īŚŎ ōŗŠŎřŖőŎ Ũ ŘřŗşŎŚŚŤ ŋŤŘŗŔŖŨŧśŚ ŗ. ŖŖ ŕŎ ŋřŎ ŗōŖŗ

19


Межпроцессорное взаимодействие

10

ǼȏȧȓțȖȓ — ȫȠȜ ȣȜȞȜȦȜ — Ч

. ?Ч

ɭɩɪɚɜɥɹɬɶ ɨɬɩɪɚɜɢɬɶ ɟɦɭ ɞɚɧɧɵɟ?

ɩɪɨɱɢɬɚɬɶ ɟɝɨ ɜɵɜɨɞ? ɜɵɩɨɥɧɹɬɶ ɪɚɛɨɬɭ

,

.

,

ɨɛɳɚɬɶɫɹ

. 466 467 468 fileno()

469 474 478 479 :

480 481 481

-

482 487 488

ssigaction

#include <stdio.h>

sigaction()

489 490

,

int main()

kill

493 502

{ char name[30]; printf("Введите свое имя: "); fgets(name, 30, stdin); printf("Привет, %s\n", name); return 0; File Edit Window Help

}

> ./greetings Введите свое имя: ^C > ĮŚŔő ŋŤ ŖʼnŏŕŎśŎ Ctrl + C, ŘřŗŌřʼnŕŕʼn ŘŎřŎŚśʼnŖŎś řʼnŊŗśʼnśť. Ķŗ ŘŗŠŎŕŜ?

20

ɨɝɥɚɜɥɟɧɢɟ


Сокеты и работа в Сети

11

ǻȓȠ ȚȓȟȠȎ șȡȥȦȓ, ȥȓȚ 127.0.0.1 . / , ɪɚɡɝɨɜɚɪɢɜɚɬɶ ɫɨ ɜɫɟɦ ɨɫɬɚɥɶɧɵɦ ɦɢɪɨɦ,

. , ɩɥɚɧɟɬɵ. ,

. -

« «

-

»

504

»

505 506

508 ,

512 513 514 521 522

-

526 527 IP-

528

getaddrinfo()

529 536

ijŔőŎŖś ő ŚŎřŋŎř ŋŎōŜś ŚśřŜœśŜřőřŗŋʼnŖŖŤŒ ōőʼnŔŗŌ, ŖʼnŐŤŋʼnŎŕŤŒ ŘřŗśŗœŗŔŗŕ.

telnet

ĺŎřŋŎř ŊŜōŎś ŗŊŢʼnśťŚŨ ŗōŖŗŋřŎŕŎŖŖŗ Ś ŖŎŚœŗŔťœőŕő œŔőŎŖśʼnŕő.

telnet telnet

21


Потоки

12

ȋȠȜ ȝȎȞȎșșȓșȪțȩȗ ȚȖȞ . POSIX-

, .

!

,

,

. , ɩɪɨɛɤɢ.

,

ɜ ɜɚɲɟɦ ɤɨɞɟ ɧɟ ɨɛɪɚɡɨɜɵɜɚɥɢɫɶ POSIX-

ɫɨɯɪɚɧɹɬɶ ɰɟɥɨɫɬɧɨɫɬɶ ɯɪɭɩɤɢɯ ɞɚɧɧɵɯ. …

538 539 540

— 541 542 pthread_create

543 548 549 550 557

A ĭŋʼn ʼnŋśŗŕŗŊőŔŨ ŚőŕŋŗŔőŐőřŜŧś ōŋʼn Řŗśŗœʼn. ķŖő ŞŗśŨś ŘŗŔŜŠő śť ōŗŚśŜŘ œ ŗōŖŗŒ ő śŗŒ ŏŎ ŗŊŢŎŒ ŘŎřŎŕŎŖŖŗŒ.

B 22

ɨɝɥɚɜɥɟɧɢɟ

ŐŋŗŔŨś ĺŋŎśŗŝŗřŤ ŖŎ Řŗ Šőśť ŔŜ ōŋŜŕ Řŗśŗœʼnŕ Řŗ ŜŘ œ ŗōŖŗŒ Śś ōŗ Ŗŗ ŗōŖŗŋřŎŕŎŖ ŘŎřŎŕŎŖŖŗŒ. ő śŗŒ ŏŎ ŗŊŢŎŒ


Лабораторная работа 3

Бластероиды В лабораторной работе 3 вы отдадите дань уважения одной из самых популярных и долговечных видеоигр. Пришло время написать «Бластероиды»!

23


Приложение I

На закуску

ȀȜȝ-10 ȢȎȘȠȜȐ (ȘȜȠȜȞȩȚ Țȩ țȓ ȡȒȓșȖșȖ ȐțȖȚȎțȖȓ) Д

,

,

.

,

.

,

, . ,

,

. ,

.

№ 1.

576

№ 2.

gcc

578

№ 3.

static

579

№ 4.

580

№ 5.

581

№ 6.

gcc

582

№ 7.

make

584

№ 8.

586

№ 9.

587

№ 10.

588

Приложение II Все темы

ǰȟȝȜȚțȖȠȪ Ȑȟȓ ? ,

. ,

, . .

24

ɨɝɥɚɜɥɟɧɢɟ

. ,

,


1 Начинаем работать с языком Си

ǽȜȑȞȡȔȎȓȚȟȭ ǴȄȋȆȉ Ȗȟ ȑȉ ȏȢȅȌȜȠ ȇȏȗȅȒȎȒȉ ȕȌȑȉȉ ȐȒȔȉ? dzȔȌȕȒȉȈȌȑȣȍȕȣ, ȆȒȈȌțȎȄ ȓȔȉȎȔȄȕȑȄȣ!

Х

,

?

ȼɚɦ ɧɭɠɧɨ ɧɚɩɢɫɚɬɶ ɞɥɹ ɧɨɜɨɣ ɢɝɪɵ? Ɂɚɩɪɨɝɪɚɦɦɢɪɨɜɚɬɶ ɤɨɧɬɪɨɥɥɟɪ Arduino? ɂɥɢ ɢɫɩɨɥɶɡɨɜɚɬɶ ɩɪɨɞɜɢɧɭɬɭɸ ɜ ɫɜɨɟɦ ɩɪɢɥɨɠɟɧɢɢ ɞɥɹ iPhone? Ɍɨɝɞɚ ɹɡɵɤ ɋɢ ɜɚɦ ɩɨɦɨɠɟɬ. Cɢ ɪɚɛɨɬɚɟɬ ɧɚ , ɱɟɦ ɛɨɥɶɲɢɧɫɬɜɨ ɞɪɭɝɢɯ ɹɡɵɤɨɜ ɩɪɨɝɪɚɦɦɢɪɨɜɚɧɢɹ, ɩɨɷɬɨɦɭ ɩɨɧɢɦɚɧɢɟ ɋɢ ɩɨɡɜɨɥɢɬ ɜɚɦ ɥɭɱɲɟ ɪɚɡɨɛɪɚɬɶɫɹ ɜ ɬɨɦ, . ɋɢ ɬɚɤɠɟ ɦɨɠɟɬ ɩɨɦɨɱɶ ɜ ɨɫɜɨɟɧɢɢ ɞɪɭɝɢɯ ɹɡɵɤɨɜ. ɉɨɷɬɨɦɭ ɯɜɚɬɚɣɬɟ ɫɜɨɣ ɤɨɦɩɢɥɹɬɨɪ ɢ ɧɟɦɟɞɥɟɧɧɨ ɩɪɢɫɬɭɩɚɣɬɟ ɤ ɞɟɥɭ.

37


К

Си – это язык для компактных быстрых программ .

.Э ȘȜȒ țȎȖȏȜșȓȓ ȝȜțȭȠȓț Ȓșȭ ȘȜȚȝȪȬȠȓȞȎ.

, ,

ȟȜȕȒȎțțȩȗ ȟ ȓȑȜ ȝȜȚȜȧȪȬ

Как работает Си — —

. ȘȜȚȝȖșȭȠȜȞȎ.

#include <stdio.h>

ŗś ī Windows Ŧś ś ōŎ ŊŜ ŝʼnŒŔ ŖŎ ŖʼnŐŤŋʼnśťŚŨ s.exe. ck ro rocks, ʼn

int main() File Edit Window Help Compile

{ puts("C Rocks!");

> gcc rocks.c -o rocks >

return 0; } rocks.c

rocks

1

3

2

Исходник

Компиляция

.

Вывод

.

, ȖȟȝȜșțȭȓȚȩȚ. Э —

,

, .

,

, .

, .

ǿȖ ȖȟȝȜșȪȕȡȓȠȟȭ ȠȎȚ, ȑȒȓ ȐȎȔțȩ ȟȘȜȞȜȟȠȪ Ȗ ȜȏȨȓȚ. ǯȜșȪȦȖțȟȠȐȜ ȜȝȓȞȎȤȖȜțțȩȣ ȟȖȟȠȓȚ țȎȝȖȟȎțȜ țȎ ǿȖ. ǺțȜȑȖȓ ȘȜȚȝȪȬȠȓȞțȩȓ ȭȕȩȘȖ ȠȎȘȔȓ țȎȝȖȟȎțȩ țȎ ǿȖ, ȞȎȐțȜ ȘȎȘ Ȗ ȏȜșȪȦȎȭ ȥȎȟȠȪ ȖȑȞȜȐȩȣ ȝȞȜȑȞȎȚȚ.

38

1

ȼɵ ɦɨɠɟɬɟ ɫɬɨɥɤɧɭɬɶɫɹ ɫ ɬɪɟɦɹ ɫɬɚɧɞɚɪɬɚɦɢ ɹɡɵɤɚ ɋɢ. ANSI C ɛɵɥ ɫɨɡɞɚɧ ɜ ɤɨɧɰɟ 1980-ɯ ɝɝ. ɢ ɢɫɩɨɥɶɡɭɟɬɫɹ ɞɥɹ ɧɚɢɛɨɥɟɟ ɫɬɚɪɨɝɨ ɤɨɞɚ. ȼ 1999 ɝ. ɦɧɨɝɢɟ ɚɫɩɟɤɬɵ ɹɡɵɤɚ ɛɵɥɢ ɢɫɩɪɚɜɥɟɧɵ ɜ ɫɬɚɧɞɚɪɬɟ C99. Ⱥ ɜ 2011 ɝ. ɩɨɹɜɢɥɫɹ ɫɨɜɪɟɦɟɧɧɵɣ ɫɬɚɧɞɚɪɬ C11 ɫ ɧɟɤɨɬɨɪɵɦɢ ɧɨɜɵɦɢ ɢɧɬɟɪɟɫɧɵɦɢ ɜɨɡɦɨɠɧɨɫɬɹɦɢ. Ɉɬɥɢɱɢɹ ɦɟɠɞɭ ɪɚɡɧɵɦɢ ɜɟɪɫɢɹɦɢ ɧɟ ɨɱɟɧɶ ɛɨɥɶɲɢɟ, ɢ ɦɵ ɛɭɞɟɦ ɭɤɚɡɵɜɚɬɶ ɧɚ ɧɢɯ ɜɪɟɦɹ ɨɬ ɜɪɟɦɟɧɢ.


Наточите свой карандаш int card_count = 11;

Попытайтесь угадать, что делает каждый из этих фрагментов. ķŘőšőśŎ ōŎŒŚśŋőŨ, œŗśŗřŤŎ, Ŧśŗś œŗō. Řŗ ŋʼnšŎŕŜ ŕŖŎŖőŧ, ŋŤŘŗŔŖŨŎś

if (card_count > 10) puts("Карты в колоде удачные. Повышаем ставку.");

int c = 10; while (c > 0) { puts("Я не должен писать код в виде классов"); c = c - 1; }

/* Подразумевается, что имя короче 20 латинских (и 10 кириллических) символов. */ char ex[20]; puts("Введите имя вашей девушки:"); scanf("%19s", ex); printf("Дорогая %s. \n\n\tС тобой покончено.\n”, ex);

char suit = 'H'; switch(suit) { case 'C': puts("Clubs(Трефы)"); break; case 'D': puts("Diamonds(Бубны)"); break; case 'H': puts("Hearts(Черви)"); break; default: puts("Spades(Пики)"); }

ɜɵ ɡɞɟɫɶ 

39


Наточите свой карандаш Не волнуйтесь, если вам что-то непонятно. Далее в этой Решение книге будут даны более подробные пояснения. int card_count = 11;

int — şŎŔŗŎ ŠőŚŔŗ.

if (card_count > 10) puts("Карты в колоде удачные. Повышаем ставку.");

İōŎŚť śŎœŚś ŋŤŋŗōőśŚŨ ŋ œŗŕʼnŖōŖŗŒ ŚśřŗœŎ őŔő Ŗʼn śŎřŕőŖʼnŔ. ĽőŌŜřŖŤŎ ŚœŗŊœő ŗŘřŎōŎŔŨŧś ŊŔŗŠŖŜŧ int c = 10; őŖŚśřŜœşőŧ.

Создаем целочисленную переменную и устанавливаем для нее значение 11. Счетчик больше 10? Если да, то выводим сообщение в командной строке.

Создаем целочисленную переменную и устанавливаем для нее значение 10.

while (c > 0) {

До тех пор пока значение больше 0,...

puts("Я не должен писать код в виде классов");

...выводим сообщение...

c = c - 1;

...и уменьшаем счетчик. Конец кода, который должен повторяться.

}

/* Подразумевается, что имя короче 20 латинских (и 10 кириллических) символов. */ char ex[20];

Это комментарий. Создаем массив из 20 символов. Выводим сообщение на экран.

puts("Введите имя вашей девушки: ");

ņśŗ ŗŐŖʼnŠʼnŎś «ŘŗŕŎŚśőśť ŋŚŎ, Šśŗ

Сохраняем в массив то, что ввел пользователь.

scanf("%19s", ex); ŋŋŎŔ ŘŗŔťŐŗŋʼnśŎŔť, ŋŖŜśřť ŕʼnŚŚőŋʼn ex». Выводим сообщение, printf("Дорогая %s. \n\n\tС тобой покончено.\n”, включающее введенный текст. ex); İōŎŚť Śśřŗœʼn Śőŕ ŋŗŔŗŋ ŋŚśʼnŋŔŨŎśŚŨ Ŗʼn ŕŎŚ śŗ %s.

char suit = 'H'; switch(suit) { case 'C':

ıŖŚśřŜœşőŨ switch Řřŗ ŋŎřŨŎś ŗōŖŜ ő śŜ ŏŎ ŘŎřŎŕŎŖŖŜ ŧ Ŗʼn řʼnŐŖŤŎ ŐŖʼnŠŎŖőŨ.

Проверяем значение переменной. Оно равно «C»?

puts("Clubs(Трефы)");

Если да, то выводим «Clubs (Трефы)».

break;

Затем пропускаем остальные проверки.

case 'D': puts("Diamonds(Бубны)"); break; case 'H':

Оно равно «D»? Если да, то выводим «Diamonds (Бубны)». Затем пропускаем остальные проверки. Оно равно «H»?

puts("Hearts(Черви)");

Если да, то выводим «Hearts (Черви)».

break;

Затем пропускаем остальные проверки. В противном случае...

default: puts("Spades(Пики)");

...выводим «Spades (Пики)». На этом проверки заканчиваются.

}

40

Создаем символьную переменную, помещаем в нее букву «H».

1


Как выглядит программа на Си целиком , ȖȟȣȜȒțȩȗ ȢȎȗș.

ņśŗ ŋŚŎŌŗ Ŕőšť ŜŚŔŗŋŖŗŚśť, Ŗŗ ŋŤ ōŗŔŏŖŤ ŎŎ ŚŗŊŔŧōʼnśť.

, ,

,

.c. .

dzȔȒȇȔȄȐȐȟ ȑȄ ǵȌ ȒȅȟțȑȒ ȑȄțȌȑȄȢȖȕȣ ȕ ȎȒȐȐȉȑȖȄȔȌȣ.

1

, ,

,

,

. (

)

,

, .

ijŗŕŕŎŖśʼnřőŒ Ŗʼn ŠőŖʼnŎśŚŨ Ś ŚőŕŋŗŔŗŋ /*.

/* * Программа для подсчета количества карт в колоде.

ņśő ŐŋŎŐōŗŠœő ŖŎŗŊŨŐʼnśŎŔťŖŤ ő ŖŜŏŖŤ śŗŔťœŗ ōŔŨ œřʼnŚŗśŤ. ijŗŕŕŎŖśʼnřőŒ ŐʼnœʼnŖŠő ŋʼnŎśŚŨ ŚőŕŋŗŔʼnŕő */.

2

ǨȄȏȠȜȉ ȕȏȉȈȗȉȖ țȄȕȖȠ ȕ ȓȒȈȎȏȢțȉȑȌȉȐ ȆȑȉȜȑȌș ȘȄȍȏȒȆ.

* Этот код выпущен под публичной Лас-Вегасской лицензией. * (c)2014, Команда колледжа по блек-джеку. */ #include <stdio.h> int main()

{

,

int decks; ȐțȓȦțȖȣ ȏȖȏșȖȜȠȓȘ

puts("Введите количество колод."); scanf("%i", &decks);

.

if (decks < 1) {

,

puts("Вы ввели недопустимое количество колод."); ,

return 1; } printf("Всего карт %i\n”, (decks * 52));

. stdio.h. Э stdio,

return 0; } 3

dzȒȕȏȉȈȑȉȉ, țȖȒ Ȇȟ ȑȄȍȈȉȖȉ Ȇ ȌȕșȒȈȑȒȐ ȘȄȍȏȉ, — ȡȖȒ ȘȗȑȎȚȌȌ. .

.

ȑșȎȐțȜȗ — main(). .

,

,

DzȎȐȎȗȠȓ ȞȎȟȟȚȜȠȞȖȚ ȢȡțȘȤȖȬ main() ȏȜșȓȓ ȝȜȒȞȜȏțȜ. ɜɵ ɡɞɟɫɶ 

41


Izuchaem programirovanie na c