Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ «АрхитСктура ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы UNIXΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 100

Автор ΠœΠΎΡ€ΠΈΡ Π‘Π°Ρ…

23. * Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°ΠΉΡ‚Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΠΎΠ² с использованиСм ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΌΡƒΠ»ΡŒΡ‚ΠΈΠΏΠ»Π΅ΠΊΡΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π° ΠΌΠ΅ΠΆΠ΄Ρƒ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΌ ΠΈ физичСским Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π°ΠΌΠΈ занимался Π±Ρ‹ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ ядра, Π° Π½Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ процСсс. ΠžΠΏΠΈΡˆΠΈΡ‚Π΅ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ соСдинСния ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² со свСрткой ΠΈ Ρ€Π°Π·Π²Π΅Ρ€Ρ‚ΠΊΠΎΠΉ. Π§Ρ‚ΠΎ Π»ΡƒΡ‡ΡˆΠ΅: Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ, ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡŽΡ‰ΠΈΠΉ ΠΌΡƒΠ»ΡŒΡ‚ΠΈΠΏΠ»Π΅ΠΊΡΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅, Π² состав ядра ΠΈΠ»ΠΈ ΠΏΠΎΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Π΅Π³ΠΎ ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ процСсс?

24. Команда ps сообщаСт ΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΠ½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎΠ± активности процСссов Π² Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰Π΅ΠΉ систСмС. Π’ Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹Ρ… рСализациях ps считываСт ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΈΠ· Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ процСссов, прямо ΠΈΠ· памяти ядра. Π’Π°ΠΊΠΎΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ Π½Π΅ совсСм ΡƒΠ΄ΠΎΠ±Π΅Π½ Π² срСдС Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ, ΠΊΠΎΠ³Π΄Π° Ρ€Π°Π·ΠΌΠ΅Ρ€ записСй Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ процСссов мСняСтся ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π΅ ps становится Π½Π΅Π»Π΅Π³ΠΊΠΎ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚ΡŒ Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ поля. Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°ΠΉΡ‚Π΅ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€, Π½Π΅Ρ‡ΡƒΠ²ΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΊ измСнСниям срСды.

ГЛАВА 11. Π’Π—ΠΠ˜ΠœΠžΠ”Π•Π™Π‘Π’Π’Π˜Π• ΠŸΠ ΠžΠ¦Π•Π‘Π‘ΠžΠ’

НаличиС ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΎΠ² взаимодСйствия Π΄Π°Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹ΠΌ процСссам Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡ‚ΡŒ ΠΎΠ±ΠΌΠ΅Π½ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ ΠΈ ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ своС Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ процСссами. ΠœΡ‹ ΡƒΠΆΠ΅ рассмотрСли нСсколько Ρ„ΠΎΡ€ΠΌ взаимодСйствия процСссов, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ канальная связь, использованиС ΠΏΠΎΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Ρ… ΠΊΠ°Π½Π°Π»ΠΎΠ² ΠΈ посылка сигналов. ΠšΠ°Π½Π°Π»Ρ‹ (Π½Π΅ΠΏΠΎΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Π΅) ΠΈΠΌΠ΅ΡŽΡ‚ нСдостаток, связанный с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ извСстны Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ°ΠΌ процСсса, Π²Ρ‹Π·Π²Π°Π²ΡˆΠ΅Π³ΠΎ ΡΠΈΡΡ‚Π΅ΠΌΠ½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ pipe: Π½Π΅ ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠ΅ родствСнных связСй процСссы Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ΅ΠΆΠ΄Ρƒ собой с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π½Π΅ΠΏΠΎΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Ρ… ΠΊΠ°Π½Π°Π»ΠΎΠ². НСсмотря Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΊΠ°Π½Π°Π»Ρ‹ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ΅ΠΆΠ΄Ρƒ собой процСссам, Π½Π΅ ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠΌ родствСнных связСй, ΠΎΠ½ΠΈ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π½ΠΈ Π² сСти (см. Π³Π»Π°Π²Ρƒ 13), Π½ΠΈ Π² ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ мноТСствСнных связСй ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ Π³Ρ€ΡƒΠΏΠΏΠ°ΠΌΠΈ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… процСссов: ΠΏΠΎΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΊΠ°Π½Π°Π» Π½Π΅ поддаСтся Ρ‚Π°ΠΊΠΎΠΌΡƒ ΠΌΡƒΠ»ΡŒΡ‚ΠΈΠΏΠ»Π΅ΠΊΡΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ, ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Ρƒ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΏΠ°Ρ€Ρ‹ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… процСссов имСлся Π±Ρ‹ свой Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ ΠΊΠ°Π½Π°Π». ΠŸΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹Π΅ процСссы ΠΌΠΎΠ³ΡƒΡ‚ Ρ‚Π°ΠΊΠΆΠ΅ ΡΠ²ΡΠ·Ρ‹Π²Π°Ρ‚ΡŒΡΡ ΠΌΠ΅ΠΆΠ΄Ρƒ собой благодаря посылкС сигналов с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ систСмной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ kill, ΠΎΠ΄Π½Π°ΠΊΠΎ Ρ‚Π°ΠΊΠΎΠ΅ "сообщСниС" состоит ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½ΠΎΠΌΠ΅Ρ€Π° сигнала.

Π’ Π΄Π°Π½Π½ΠΎΠΉ Π³Π»Π°Π²Π΅ ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ΡΡ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ„ΠΎΡ€ΠΌΡ‹ взаимодСйствия процСссов. Π’ Π½Π°Ρ‡Π°Π»Π΅ Ρ€Π΅Ρ‡ΡŒ ΠΈΠ΄Π΅Ρ‚ ΠΎ трассировкС процСссов, ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΎΠ΄ΠΈΠ½ процСсс слСдит Π·Π° Ρ…ΠΎΠ΄ΠΎΠΌ выполнСния Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ процСсса, Π·Π°Ρ‚Π΅ΠΌ рассматриваСтся ΠΏΠ°ΠΊΠ΅Ρ‚ IPC: сообщСния, раздСляСмая ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΈ сСмафоры. ДСлаСтся ΠΎΠ±Π·ΠΎΡ€ Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² сСтСвого взаимодСйствия процСссов, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΡ…ΡΡ Π½Π° Ρ€Π°Π·Π½Ρ‹Ρ… ΠΌΠ°ΡˆΠΈΠ½Π°Ρ…, ΠΈ, Π½Π°ΠΊΠΎΠ½Π΅Ρ†, даСтся прСдставлСниС ΠΎ "Π³Π½Π΅Π·Π΄Π°Ρ…", ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‰ΠΈΡ…ΡΡ Π² систСмС BSD. Вопросы сСтСвого взаимодСйствия, ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠ΅ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Ρ‹, адрСсация ΠΈ Π΄Ρ€., Π½Π΅ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡ‚ΡΡ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ΠΈ выходят Π·Π° Ρ€Π°ΠΌΠΊΠΈ настоящСй Ρ€Π°Π±ΠΎΡ‚Ρ‹.

11.1 Π’Π ΠΠ‘Π‘Π˜Π ΠžΠ’ΠšΠ ΠŸΠ ΠžΠ¦Π•Π‘Π‘ΠžΠ’

Π’ систСмС UNIX имССтся ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠ°Ρ Ρ„ΠΎΡ€ΠΌΠ° взаимодСйствия процСссов, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠ°Ρ Π² цСлях ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ, β€” трассировка процСссов. ΠŸΡ€ΠΎΡ†Π΅ΡΡ-ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ sdb, ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°Π΅Ρ‚ трассируСмый процСсс ΠΈ управляСт Π΅Π³ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ систСмной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ptrace, расставляя ΠΈ сбрасывая ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Ρ‹Π΅ Ρ‚ΠΎΡ‡ΠΊΠΈ, считывая ΠΈ записывая Π΄Π°Π½Π½Ρ‹Π΅ Π² Π΅Π³ΠΎ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠ΅ адрСсноС пространство. Врассировка процСссов, Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π² сСбя ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·Π°Ρ†ΠΈΡŽ выполнСния процСсса-ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠ° ΠΈ трассируСмого процСсса ΠΈ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ послСднСго.


if ((pid = fork()) == 0) {

 /* ΠΏΠΎΡ‚ΠΎΠΌΠΎΠΊ β€” трассируСмый процСсс */

 ptrace(0, 0, 0, 0);

 exec("имя трассируСмого процСсса");

}

/* ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΈΠ΅ выполнСния процСсса-ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠ° */

for (;;) {

 wait((int *) 0);

 read(входная информация для трассировки ΠΊΠΎΠΌΠ°Π½Π΄);

 ptrace(cmd, pid, …);

 if (условиС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ трассировки) break;

}

Рисунок 11.1. Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° процСсса ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ


ΠŸΡΠ΅Π²Π΄ΠΎΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, прСдставлСнная Π½Π° РисункС 11.1, ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏΠΈΡ‡Π½ΡƒΡŽ структуру ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. ΠžΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊ ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°Π΅Ρ‚ Π½ΠΎΠ²Ρ‹ΠΉ процСсс, Π·Π°ΠΏΡƒΡΠΊΠ°ΡŽΡ‰ΠΈΠΉ ΡΠΈΡΡ‚Π΅ΠΌΠ½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ptrace, Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Ρ‡Π΅Π³ΠΎ Π² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ процСссу-ΠΏΠΎΡ‚ΠΎΠΌΠΊΡƒ записи Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ процСссов ядро устанавливаСт Π±ΠΈΡ‚ трассировки. ΠŸΡ€ΠΎΡ†Π΅ΡΡ-ΠΏΠΎΡ‚ΠΎΠΌΠΎΠΊ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ для запуска (exec) трассируСмой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. НапримСр, Ссли ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π²Π΅Π΄Π΅Ρ‚ ΠΎΡ‚Π»Π°Π΄ΠΊΡƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ a.out, процСсс-ΠΏΠΎΡ‚ΠΎΠΌΠΎΠΊ запускаСт Ρ„Π°ΠΉΠ» с Ρ‚Π΅ΠΌ ΠΆΠ΅ ΠΈΠΌΠ΅Π½Π΅ΠΌ. Π―Π΄Ρ€ΠΎ ΠΎΡ‚Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ exec ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌ порядком, Π½ΠΎ Π² Ρ„ΠΈΠ½Π°Π»Π΅ Π·Π°ΠΌΠ΅Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π±ΠΈΡ‚ трассировки установлСн, ΠΈ посылаСт процСссу-ΠΏΠΎΡ‚ΠΎΠΌΠΊΡƒ сигнал прСрывания. На Π²Ρ‹Ρ…ΠΎΠ΄Π΅ ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ exec, ΠΊΠ°ΠΊ ΠΈ Π½Π° Π²Ρ‹Ρ…ΠΎΠ΄Π΅ ΠΈΠ· любой Π΄Ρ€ΡƒΠ³ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ядро провСряСт Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ сигналов, ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ²Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ посланный сигнал прСрывания ΠΈ исполняСт ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ трассировки процСсса ΠΊΠ°ΠΊ особый случай ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ сигналов. Π—Π°ΠΌΠ΅Ρ‚ΠΈΠ² установку Π±ΠΈΡ‚Π° трассировки, процСсс-ΠΏΠΎΡ‚ΠΎΠΌΠΎΠΊ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ своСго родитСля ΠΈΠ· состояния приостанова, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ послСдний находится вслСдствиС исполнСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ wait, сам ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ Π² состояниС трассировки, ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ΅ ΡΠΎΡΡ‚ΠΎΡΠ½ΠΈΡŽ приостанова (Π½ΠΎ Π½Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π½Π½ΠΎΠ΅ Π½Π° Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΠ΅ состояний процСсса, см. Рисунок 6.1), ΠΈ выполняСт ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ контСкста.

Π’Π΅ΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ Π² ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΉ ситуации процСсс-Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ (ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊ) ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ Π½Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ, оТидая получСния извСстия ΠΎΡ‚ трассируСмого процСсса. Когда ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ извСстиС процСссом-Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»Π΅ΠΌ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΎ, ΠΎΠ½ Π²Ρ‹ΠΉΠ΄Π΅Ρ‚ ΠΈΠ· состояния оТидания (wait), ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π΅Ρ‚ (read) Π²Π²Π΅Π΄Π΅Π½Π½Ρ‹Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΈ ΠΏΡ€Π΅Π²Ρ€Π°Ρ‚ΠΈΡ‚ ΠΈΡ… Π² ΡΠ΅Ρ€ΠΈΡŽ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠΉ ΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ptrace, ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΡ… трассировкой процСсса-ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ°. Бинтаксис Π²Ρ‹Π·ΠΎΠ²Π° систСмной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ptrace:


ptrace(cmd, pid, addr, data);


Π³Π΄Π΅ Π² качСствС cmd ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, чтСния Π΄Π°Π½Π½Ρ‹Ρ…, записи Π΄Π°Π½Π½Ρ‹Ρ…, возобновлСния выполнСния ΠΈ Ρ‚. ΠΏ., pid β€” ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ трассируСмого процСсса, addr β€” Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΉ адрСс ячСйки Π² трассируСмом процСссС, Π³Π΄Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ запись, data β€” Ρ†Π΅Π»ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½ΠΎΠ΅ для записи. Π’ΠΎ врСмя исполнСния систСмной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ptrace ядро провСряСт, имССтся Π»ΠΈ Ρƒ ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠ° ΠΏΠΎΡ‚ΠΎΠΌΠΎΠΊ с ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ pid ΠΈ находится Π»ΠΈ этот ΠΏΠΎΡ‚ΠΎΠΌΠΎΠΊ Π² состоянии трассировки, послС Ρ‡Π΅Π³ΠΎ Π·Π°Π²ΠΎΠ΄ΠΈΡ‚ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½ΡƒΡŽ структуру Π΄Π°Π½Π½Ρ‹Ρ…, ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½ΡƒΡŽ для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π΄Π°Π½Π½Ρ‹Ρ… ΠΌΠ΅ΠΆΠ΄Ρƒ двумя процСссами. Π§Ρ‚ΠΎΠ±Ρ‹ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ процСссы, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΠ΅ трассировку, Π½Π΅ ΠΌΠΎΠ³Π»ΠΈ Π·Π°Ρ‚Π΅Ρ€Π΅Ρ‚ΡŒ содСрТимоС этой структуры, ΠΎΠ½Π° блокируСтся ядром, ядро записываСт Π² Π½Π΅Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ cmd, addr ΠΈ data, возобновляСт процСсс-ΠΏΠΎΡ‚ΠΎΠΌΠΎΠΊ, ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΈΡ‚ Π΅Π³ΠΎ Π² состояниС "готовности ΠΊ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡŽ" ΠΈ приостанавливаСтся Π΄ΠΎ получСния ΠΎΡ‚ Π½Π΅Π³ΠΎ ΠΎΡ‚Π²Π΅Ρ‚Π°. Когда процСсс-ΠΏΠΎΡ‚ΠΎΠΌΠΎΠΊ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ своС Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ (Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ ядра), ΠΎΠ½ исполнит ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΡƒΡŽ (Ρ‚Ρ€Π°ΡΡΠΈΡ€ΡƒΠ΅ΠΌΡƒΡŽ) ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ, Π·Π°ΠΏΠΈΡˆΠ΅Ρ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π² Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½ΡƒΡŽ структуру ΠΈ "Ρ€Π°Π·Π±ΡƒΠ΄ΠΈΡ‚" ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠ°. Π’ зависимости ΠΎΡ‚ Ρ‚ΠΈΠΏΠ° ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΏΠΎΡ‚ΠΎΠΌΠΎΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ вновь ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ Π² состояниС трассировки ΠΈ ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒ поступлСния Π½ΠΎΠ²ΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΈΠ»ΠΈ ΠΆΠ΅ Π²Ρ‹ΠΉΡ‚ΠΈ ΠΈΠ· Ρ†ΠΈΠΊΠ»Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ сигналов ΠΈ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ своС Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅. ΠŸΡ€ΠΈ Π²ΠΎΠ·ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠ° ядро Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½Π½ΠΎΠ΅ трассируСмым процСссом, снимаСт с глобальной структуры Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ.

Если Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π° процСсса-ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ° Π² состояниС трассировки ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊ Π½Π΅ находится Π² состоянии приостанова (wait), ΠΎΠ½ Π½Π΅ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ°, ΠΏΠΎΠΊΠ° Π½Π΅ обратится ΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ wait, послС Ρ‡Π΅Π³ΠΎ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ Π²Ρ‹ΠΉΠ΄Π΅Ρ‚ ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΏΠΎ Π²Ρ‹ΡˆΠ΅ΠΎΠΏΠΈΡΠ°Π½Π½ΠΎΠΌΡƒ ΠΏΠ»Π°Π½Ρƒ.


int data[32];

main() {

 int i;

 for (i = 0; i β€Ή 32; i++) printf("data[%d] = %d\n", i, data[i]);

 printf("ptrace data addr 0x%x\n", data);

}

Рисунок 11.2. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° trace (трассируСмый процСсс)


#define TR_SETUP 0

#define TR_WRITE 5

#define TR_RESUME 7

int addr;

main(argc, argv)

int argc;

char *argv[];

{

 int i, pid;

 sscanf(argv[1], "%x", &addr);

 if ((pid = fork() == 0) {

  ptrace(TR_SETUP, 0, 0, 0);

  execl("trace", "trace", 0);

  exit();

 }

 for (i = 0; i β€Ή 32, i++) {

  wait((int *) 0);

  /* Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ i Π² пространство процСсса с ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ pid ΠΏΠΎ адрСсу, содСрТащСмуся Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ addr */

  if (ptrace(TR_WRITE, pid, addr, i) == -1) exit();

  addr += sizeof(int);

 }

 /* трассируСмый процСсс возобновляСт Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ */

 ptrace(TR_RESUME, pid, 1, 0);

}

Рисунок 11.3. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° debug (Ρ‚Ρ€Π°ΡΡΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ процСсс)


Рассмотрим Π΄Π²Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Π΅ Π½Π° Рисунках 11.2 ΠΈ 11.3 ΠΈ ΠΈΠΌΠ΅Π½ΡƒΠ΅ΠΌΡ‹Π΅ trace ΠΈ debug, соотвСтствСнно. ΠŸΡ€ΠΈ запускС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ trace с Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π° массив data Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π½ΡƒΠ»Π΅Π²Ρ‹Π΅ значСния; процСсс Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ адрСс массива ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ. ΠŸΡ€ΠΈ запускС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ debug с ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ΠΉ Π΅ΠΉ Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° значСния, Π²Ρ‹Π²Π΅Π΄Π΅Π½Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ trace, происходит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅: ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ addr, создаСт Π½ΠΎΠ²Ρ‹ΠΉ процСсс, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ptrace ΠΏΠΎΠ΄Π³ΠΎΡ‚Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉ сСбя ΠΊ трассировкС, ΠΈ запускаСт ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ trace. На Π²Ρ‹Ρ…ΠΎΠ΄Π΅ ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ exec ядро посылаСт процСссу-ΠΏΠΎΡ‚ΠΎΠΌΠΊΡƒ (Π½Π°Π·ΠΎΠ²Π΅ΠΌ Π΅Π³ΠΎ Ρ‚ΠΎΠΆΠ΅ trace) сигнал SIGTRAP (сигнал прСрывания), процСсс trace ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ Π² состояниС трассировки, оТидая поступлСния ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΎΡ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ debug. Если процСсс, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ debug, находился Π² состоянии приостанова, связанного с Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ wait, ΠΎΠ½ "пробуТдаСтся", ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ²Π°Π΅Ρ‚ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ ΠΏΠΎΡ€ΠΎΠΆΠ΄Π΅Π½Π½ΠΎΠ³ΠΎ трассируСмого процСсса ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ wait. Π—Π°Ρ‚Π΅ΠΌ процСсс debug Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ptrace, записываСт Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Ρ†ΠΈΠΊΠ»Π° i Π² пространство Π΄Π°Π½Π½Ρ‹Ρ… процСсса trace ΠΏΠΎ адрСсу, содСрТащСмуся Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ addr, ΠΈ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ addr; Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ trace пСрСмСнная addr Ρ…Ρ€Π°Π½ΠΈΡ‚ адрСс Ρ‚ΠΎΡ‡ΠΊΠΈ Π²Ρ…ΠΎΠ΄Π° Π² массив data. ПослСднСС ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ процСсса debug ΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ptrace Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ запуск ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ trace, ΠΈ Π² этот ΠΌΠΎΠΌΠ΅Π½Ρ‚ массив data содСрТит значСния ΠΎΡ‚ 0 Π΄ΠΎ 31. ΠžΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠΈ, ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Π΅ sdb, ΠΈΠΌΠ΅ΡŽΡ‚ доступ ΠΊ Ρ‚Π°Π±Π»ΠΈΡ†Π΅ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ² трассируСмого процСсса, ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΎΠ½ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‚ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎΠ± адрСсах Π΄Π°Π½Π½Ρ‹Ρ…, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ptrace.