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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ для Linux. ΠŸΡ€ΠΎΡ„Π΅ΡΡΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 14

Автор ΠœΠ°Ρ€ΠΊ ΠœΠΈΡ‚Ρ‡Π΅Π»Π»

Как ΠΆΠ΅ Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΡ‚ΡŒ ΠΌΠ΅ΠΆΠ΄Ρƒ собой ΠΎΠ±Π° процСсса? Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ процСсс β€” это Π½ΠΎΠ²Ρ‹ΠΉ, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ появившийся Π² систСмС процСсс, поэтому Π΅Π³ΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ отличаСтся ΠΎΡ‚ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ процСсса. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ getpid() ΠΈ ΡƒΠ·Π½Π°Ρ‚ΡŒ, Π³Π΄Π΅ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΎΠ½Π° находится. Но сама функция fork() Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ Π΄Ρ€ΡƒΠ³ΠΎΠΉ способ: ΠΎΠ½Π° Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ€Π°Π·Π½Ρ‹Π΅ значСния Π² Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠΌ ΠΈ Π΄ΠΎΡ‡Π΅Ρ€Π½Π΅ΠΌ процСссах. Π ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ процСсс ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ своСго ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ°, Π° Π΄ΠΎΡ‡Π΅Ρ€Π½Π΅ΠΌΡƒ процСссу возвращаСтся 0. Π’ систСмС Π½Π΅Ρ‚ процСссов с Π½ΡƒΠ»Π΅Π²Ρ‹ΠΌ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π»Π΅Π³ΠΊΠΎ разбираСтся Π² ситуации.

Π’ листингС 3.3 ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ вСтвлСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ fork(). Π£Ρ‡Ρ‚ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ пСрвая Ρ‡Π°ΡΡ‚ΡŒ инструкции if выполняСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠΌ процСссС, Ρ‚ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ Π²Π΅Ρ‚Π²ΡŒ else β€” Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Π΄ΠΎΡ‡Π΅Ρ€Π½Π΅ΠΌ.

Листинг 3.3. (fork.c) Π’Π΅Ρ‚Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ fork()

#include <stdio.h>

#include <sys/types.h>

#include <unistd.h>


int main() {

 pid_t child_pid;

 printf("The main program process ID is %d\n",

  (int)getpid());


 child_pid = fork();

 if (child_pid != 0) {

  printf("This is the parent process, with ID %d\n",

   (int)getpid());

  printf("The child's process ID is %d\n", (int)child_pid);

 } else

  printf("This is the child process, with ID %d\n",

   (int)getpid());

 return 0;

}

БСмСйство Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ exec()

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ сСмСйства exec() Π·Π°ΠΌΠ΅Π½ΡΡŽΡ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΡƒΡŽΡΡ Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ процСссС, Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ. Когда ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ exec(), Π΅Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ прСкращаСтся ΠΈ Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ новая ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°.

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ, входящиС Π² сСмСйство exec(), Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ Π΄Ρ€ΡƒΠ³ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³Π° ΠΏΠΎ своим возмоТностям ΠΈ способу Π²Ρ‹Π·ΠΎΠ²Π°.

β–  Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π² Π½Π°Π·Π²Π°Π½ΠΈΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… присутствуСт суффикс 'p' (execvp() ΠΈ execlp()), ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° имя ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈ ΠΈΡ‰ΡƒΡ‚ эту ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°Ρ…, опрСдСляСмых ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΌ срСды PATH. ВсСм ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹ΠΌ функциям Π½ΡƒΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ ΠΏΠΎΠ»Π½ΠΎΠ΅ ΠΏΡƒΡ‚Π΅Π²ΠΎΠ΅ имя ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

β–  Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π² Π½Π°Π·Π²Π°Π½ΠΈΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… присутствуСт суффикс 'v' (execv(), execvp() ΠΈ execve()), ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ список Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π² Π²ΠΈΠ΄Π΅ массива строковых ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ, ΠΎΠΊΠ°Π½Ρ‡ΠΈΠ²Π°ΡŽΡ‰Π΅Π³ΠΎΡΡ NULL-ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΌ. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ с суффиксом 'l' (execl(), execlp() ΠΈ execle()) ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ список Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π°.

β–  Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π² Π½Π°Π·Π²Π°Π½ΠΈΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… присутствуСт суффикс 'e' (execve() ΠΈ execle()), Π² качСствС Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ массив ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… срСды. Π­Ρ‚ΠΎΡ‚ массив содСрТит строковыС ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ ΠΈ оканчиваСтся пустым ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΌ. КаТдая строка Π΄ΠΎΠ»ΠΆΠ½Π° ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΈΠ΄ "ΠŸΠ•Π Π•ΠœΠ•ΠΠΠΠ―=Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅".

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ функция exec() замСняСт ΠΎΠ΄Π½Ρƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π΄Ρ€ΡƒΠ³ΠΎΠΉ, ΠΎΠ½Π° Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ β€” Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ссли Π²Ρ‹Π·ΠΎΠ² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ оказался Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ΅Π½ Π² случаС ошибки.

Бписок Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ², ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΡ‹Ρ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅, Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π΅Π½ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки, ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΌ ΠΏΡ€ΠΈ запускС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π² ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅. Π˜Ρ… Ρ‚ΠΎΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² argc ΠΈ argv Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ main(). НС Π·Π°Π±Ρ‹Π²Π°ΠΉΡ‚Π΅, ΠΊΠΎΠ³Π΄Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ запускаСт ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ ΠΊΠΎΠΌΠ°Π½Π΄, ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ элСмСнт массива argv Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ имя ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Π° Π΄Π°Π»Π΅Π΅ Π±ΡƒΠ΄ΡƒΡ‚ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹. Аналогичным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ слСдуСт ΠΏΠΎΡΡ‚ΡƒΠΏΠΈΡ‚ΡŒ, формируя список Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ exec().

БовмСстноС использованиС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ fork() ΠΈ exec()

Бтандартная ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈΠΊΠ° запуска ΠΎΠ΄Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈΠ· Π΄Ρ€ΡƒΠ³ΠΎΠΉ Ρ‚Π°ΠΊΠΎΠ²Π°: сначала с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ fork() создаСтся Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ процСсс, Π·Π°Ρ‚Π΅ΠΌ Π² Π½Π΅ΠΌ вызываСтся функция exec(). Π­Ρ‚ΠΎ позволяСт Π³Π»Π°Π²Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Ρ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π² Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠΌ процСссС.

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, показанная Π² листингС 3.4, ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ содСрТимоС ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠ³ΠΎ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ls, ΠΊΠ°ΠΊ ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π² листингС 3.2. Но Π½Π° этот Ρ€Π°Π· ΠΊΠΎΠΌΠ°Π½Π΄Π° ls вызываСтся Π½Π΅ ΠΈΠ· ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π°, Π° Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ; Π΅ΠΉ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ -l ΠΈ /.

Листинг 3.4. (fork-exec.с) БовмСстноС использованиС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ fork() ΠΈ exec()

#include <stdio.h>

#include <stdlib.h>

#include <sys/types.h>

#include <unistd.h>


/* Запуск Π΄ΠΎΡ‡Π΅Ρ€Π½Π΅Π³ΠΎ процСсса Π² Π²ΠΈΠ΄Π΅ Π½ΠΎΠ²ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€

   PROGRAM β€” это имя Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹; Π΅Π΅ поиск Π±ΡƒΠ΄Π΅Ρ‚

   ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡ‚ΡŒΡΡ Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°Ρ…, опрСдСляСмых ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ срСды PATH.

   ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ARG_LIST -- это список строковых Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ²,

   ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΡ‹Ρ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ (Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΠΊΠ°Π½Ρ‡ΠΈΠ²Π°Ρ‚ΡŒΡΡ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΌ NULL).

   Ѐункция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΏΠΎΡ€ΠΎΠΆΠ΄Π΅Π½Π½ΠΎΠ³ΠΎ процСсса. */

int spawn(char* program, char** arg_list) {

 pid_t child_pid;

 /* Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΊΠΎΠΏΠΈΠΈ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ процСсса. */

 child_pid = fork();

 if (child_pid != 0)

  /* Π­Ρ‚ΠΎ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ процСсс. */

  return child_pid;

 else {

  /* Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. */

  execvp(program, arg_list);

  /* Ѐункция execvp() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² случаС

    ошибки. */

  fprintf(stderr, "an error occurred in execvp\n");

  abort();

 }

}


int main() {

 /* Бписок Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ², ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΡ‹Ρ… ΠΊΠΎΠΌΠ°Π½Π΄Π΅ ls. */

 char* arg_list[] = {

  "ls", /* argv[0] -- имя ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. */

  "-l",

  NULL /* Бписок Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΠΊΠ°Π½Ρ‡ΠΈΠ²Π°Ρ‚ΡŒΡΡ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΌ

          NULL. */

 };

 /* ΠŸΠΎΡ€ΠΎΠΆΠ΄Π°Π΅ΠΌ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ процСсс, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ выполняСт ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ ls.

    Π˜Π³Π½ΠΎΡ€ΠΈΡ€ΡƒΠ΅ΠΌ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹ΠΉ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Π΄ΠΎΡ‡Π΅Ρ€Π½Π΅Π³ΠΎ процСсса. */

 spawn("ls", arg_list);

 printf("done with main program\n");

 return 0;

}

3.2.3. ΠŸΠ»Π°Π½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ процСссов

ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Π°Ρ систСма Linux ΠΏΠ»Π°Π½ΠΈΡ€ΡƒΠ΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΡ… ΠΈ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΡ… процСссов нСзависимо Π΄Ρ€ΡƒΠ³ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³Π°. НСт Π³Π°Ρ€Π°Π½Ρ‚ΠΈΠΈ, Ρ‡Ρ‚ΠΎ ΠΎΠ΄ΠΈΠ½ процСсс Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΏΡƒΡ‰Π΅Π½ Ρ€Π°Π½ΡŒΡˆΠ΅ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ. ΠΈ нСизвСстно, ΠΊΠ°ΠΊ Π΄ΠΎΠ»Π³ΠΎ ΠΎΠ΄ΠΈΠ½ процСсс Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ, ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ Linux ΠΏΡ€Π΅Ρ€Π²Π΅Ρ‚ Π΅Π³ΠΎ Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΈ пСрСдаст ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ процСссу. Π’ частности, ΠΊ ΠΌΠΎΠΌΠ΅Π½Ρ‚Ρƒ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ процСсса ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π° ls Π΅Ρ‰Π΅ Π½Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π°, Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π° частично ΠΈΠ»ΠΈ ΡƒΠΆΠ΅ Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΠ»Π° свою Ρ€Π°Π±ΠΎΡ‚Ρƒ.[11] Linux лишь Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ любой процСсс ΠΊΠΎΠ³Π΄Π°-Π½ΠΈΠ±ΡƒΠ΄ΡŒ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ свой "кусочСк ΠΏΠΈΡ€ΠΎΠ³Π°": Π½ΠΈ ΠΎΠ΄ΠΈΠ½ процСсс Π½Π΅ окаТСтся ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ Π»ΠΈΡˆΠ΅Π½Π½Ρ‹ΠΌ доступа ΠΊ процСссору.

МоТно ΡΠΎΠΎΠ±Ρ‰ΠΈΡ‚ΡŒ систСмС ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ процСсс Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ Π²Π°ΠΆΠ΅Π½ ΠΈ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ с ΠΏΠΎΠ½ΠΈΠΆΠ΅Π½Π½Ρ‹ΠΌ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌ. Π­Ρ‚ΠΎ дСлаСтся ΠΏΡƒΡ‚Π΅ΠΌ ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΡ Ρ„Π°ΠΊΡ‚ΠΎΡ€Π° уступчивости процСсса. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Ρƒ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ процСсса Π½ΡƒΠ»Π΅Π²ΠΎΠΉ Ρ„Π°ΠΊΡ‚ΠΎΡ€ уступчивости. ΠŸΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΠ΅ этого значСния ΡΠ²ΠΈΠ΄Π΅Ρ‚Π΅Π»ΡŒΡΡ‚Π²ΡƒΠ΅Ρ‚ ΠΎ сниТСнии ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π° процСсса, ΠΈ Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚: процСссы с Π½ΠΈΠ·ΠΊΠΈΠΌ (Ρ‚.Π΅. ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ) Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΎΠΌ уступчивости ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‚ большС Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π½Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅.

Для запуска ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ с Π½Π΅Π½ΡƒΠ»Π΅Π²Ρ‹ΠΌ Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΎΠΌ уступчивости Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ nice -n. Рассмотрим ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

% nice -n 10 sort input.txt > output.txt

Π—Π΄Π΅ΡΡŒ активизируСтся Π΄Π»ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ опСрация сортировки, которая, благодаря ΠΏΠΎΠ½ΠΈΠΆΠ΅Π½Π½ΠΎΠΌΡƒ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Ρƒ, Π½Π΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ ΡΠΈΠ»ΡŒΠ½ΠΎΠΌΡƒ сниТСнию ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ систСмы. Π˜Π·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ„Π°ΠΊΡ‚ΠΎΡ€ уступчивости Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰Π΅Π³ΠΎΡΡ процСсса позволяСт ΠΊΠΎΠΌΠ°Π½Π΄Π° renice.

Если трСбуСтся ΠΌΠ΅Π½ΡΡ‚ΡŒ Ρ„Π°ΠΊΡ‚ΠΎΡ€ уступчивости ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΌ ΠΏΡƒΡ‚Π΅ΠΌ, Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ΡΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ nice(). Π•Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ β€” это Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Π° приращСния, добавляСмая ΠΊ Ρ„Π°ΠΊΡ‚ΠΎΡ€Ρƒ уступчивости Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π΅Π³ΠΎ процСсса. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ процСсса сниТаСтся.

Волько ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° с привилСгиями ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ root ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ процСссы с ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΎΠΌ уступчивости ΠΈΠ»ΠΈ ΠΏΠΎΠ½ΠΈΠΆΠ°Ρ‚ΡŒ это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρƒ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰Π΅Π³ΠΎΡΡ процСсса. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ nice ΠΈ renice с ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ ΠΌΠΎΠΆΠ½ΠΎ, лишь войдя Π² систСму ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ root, ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ процСсс, выполняСмый ΠΎΡ‚ ΠΈΠΌΠ΅Π½ΠΈ ΡΡƒΠΏΠ΅Ρ€ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ nice() ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠΌΠ΅ΡˆΠ°Ρ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ процСссам Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΈ ΠΌΠΎΠ½ΠΎΠΏΠΎΠ»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ систСмныС рСсурсы.

3.3. Π‘ΠΈΠ³Π½Π°Π»Ρ‹

Π‘ΠΈΠ³Π½Π°Π»Ρ‹ β€” это ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ связи ΠΌΠ΅ΠΆΠ΄Ρƒ процСссами Π² Linux. Данная Ρ‚Π΅ΠΌΠ° ΠΎΡ‡Π΅Π½ΡŒ ΠΎΠ±ΡˆΠΈΡ€Π½Π°, поэтому здСсь ΠΌΡ‹ рассмотрим лишь Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ Π²Π°ΠΆΠ½Ρ‹Π΅ сигналы ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈΠΊΠΈ управлСния процСссами.

Π‘ΠΈΠ³Π½Π°Π» прСдставляСт собой ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ΅ сообщСниС, посылаСмоС процСссу. Π‘ΠΈΠ³Π½Π°Π»Ρ‹ ΡΠ²Π»ΡΡŽΡ‚ΡΡ асинхронными: ΠΊΠΎΠ³Π΄Π° процСсс ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ сигнал, ΠΎΠ½ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ Π΅Π³ΠΎ, прСрывая Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ Π΄Π°ΠΆΠ΅ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ строки ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π•ΡΡ‚ΡŒ нСсколько дСсятков Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… сигналов, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΈΠΌΠ΅Π΅Ρ‚ своС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ΅ Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. ВсС ΠΎΠ½ΠΈ Ρ€Π°ΡΠΏΠΎΠ·Π½Π°ΡŽΡ‚ΡΡ ΠΏΠΎ Π½ΠΎΠΌΠ΅Ρ€Π°ΠΌ, Π½ΠΎ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ… для ссылки Π½Π° сигналы ΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ символичСскими константами. Π’ Linux эти константы ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ Π² Ρ„Π°ΠΉΠ»Π΅ /usr/include/bits/signum.h (Π΅Π³ΠΎ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, для этого Π΅ΡΡ‚ΡŒ Ρ„Π°ΠΉΠ» <signal.h>).