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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«UNIX β€” ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Π°Ρ срСда программирования». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 60

Автор Π‘Ρ€Π°ΠΉΠ°Π½ ΠšΠ΅Ρ€Π½ΠΈΠ³Π°Π½

echo "Π’ этом Π²ΠΈΠ½ΠΎΠ²Π°Ρ‚ `random people`!"

$ scapegoat

Π’ этом Π²ΠΈΠ½ΠΎΠ²Π°Ρ‚ КСн!

$

Π£Π±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ random Ρ…ΠΎΡ€ΠΎΡˆΠ° нСзависимо ΠΎΡ‚ распрСдСлСния Π΄Π»ΠΈΠ½Ρ‹ строк.

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 7.16

Помимо ΠΏΡ€ΠΎΡ‡Π΅Π³ΠΎ Π² индСксном дСскрипторС ΡƒΠΊΠ°Π·Π°Π½Ρ‹ адрСса размСщСния Π±Π»ΠΎΠΊΠΎΠ² Ρ„Π°ΠΉΠ»Π° Π½Π° дискС. РассмотритС Ρ„Π°ΠΉΠ» <sys/into.h>, Π° Π·Π°Ρ‚Π΅ΠΌ Π½Π°ΠΏΠΈΡˆΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ icat, которая Π΄ΠΎΠ»ΠΆΠ½Π° Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ»Ρ‹, описываСмыС Π½ΠΎΠΌΠ΅Ρ€ΠΎΠΌ записи ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° ΠΈ устройством диска. (Она, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Ρ‚ΠΎΠΌ случаС, Ссли Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡ‹ΠΉ диск ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ Π½Π° Ρ‡Ρ‚Π΅Π½ΠΈΠ΅.) ΠŸΡ€ΠΈ ΠΊΠ°ΠΊΠΈΡ… ΠΎΠ±ΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΡΡ‚Π²Π°Ρ… icat ΠΏΠΎΠ»Π΅Π·Π½Π°?

7.4 ΠŸΡ€ΠΎΡ†Π΅ΡΡΡ‹

Π’ этом Ρ€Π°Π·Π΄Π΅Π»Π΅ ΠΌΡ‹ ΠΏΠΎΠΊΠ°ΠΆΠ΅ΠΌ Π²Π°ΠΌ, ΠΊΠ°ΠΊ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΎΠ΄Π½Ρƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, Π²Ρ‹Π·Π²Π°Π² Π΅Π΅ ΠΈΠ· Π΄Ρ€ΡƒΠ³ΠΎΠΉ. Π‘Π°ΠΌΡ‹ΠΉ Π»Π΅Π³ΠΊΠΈΠΉ ΠΏΡƒΡ‚ΡŒ β€” ΠΏΡ€ΠΈΠ²Π»Π΅Ρ‡ΡŒ ΡΡ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½ΡƒΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅Ρ‡Π½ΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ system, ΡƒΠΏΠΎΠΌΡΠ½ΡƒΡ‚ΡƒΡŽ, Π½ΠΎ Π·Π°Π±Ρ€Π°ΠΊΠΎΠ²Π°Π½Π½ΡƒΡŽ Π² Π³Π». 6. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° system ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΎΠ΄ΠΈΠ½ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ β€” ΠΊΠΎΠΌΠ°Π½Π΄Π½ΡƒΡŽ строку Π² Ρ‚ΠΎΠΌ Π²ΠΈΠ΄Π΅, Π² ΠΊΠ°ΠΊΠΎΠΌ ΠΎΠ½Π° вводится с Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π° (Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ символа ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° строки), ΠΈ выполняСт Π΅Π΅ ΠΏΠΎΡ€ΠΎΠΆΠ΄Π΅Π½Π½Ρ‹ΠΌ shell. Если командная строка Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ создана ΠΈΠ· кусочков, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠ±Π΅Π³Π½ΡƒΡ‚ΡŒ ΠΊ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ памяти ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ sprintf. Π’ ΠΊΠΎΠ½Ρ†Π΅ Ρ€Π°Π·Π΄Π΅Π»Π° ΠΌΡ‹ рассмотрим Π±ΠΎΠ»Π΅Π΅ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ system для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²Ρ‹ΠΌΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°ΠΌΠΈ, Π½ΠΎ ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΈΠ·ΡƒΡ‡Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π² Ρ†Π΅Π»ΠΎΠΌ, обсудим структуры, ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΎΠ½Π° составляСтся.

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ процСсса Π½ΠΈΠ·ΠΊΠΎΠ³ΠΎ уровня: execlp ΠΈ execvp

Бамая ваТная опСрация - Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π±Π΅Π· Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ систСмного Π²Ρ‹Π·ΠΎΠ²Π° execlp. НапримСр, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΠΏΠ΅Ρ‡Π°Ρ‚Π°Ρ‚ΡŒ Π΄Π°Ρ‚Ρƒ ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Ρ‚Π΅ΠΌ самым послСднСС дСйствиС Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚

execlp("date", "date", (char*)0);

ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ execlp Π΅ΡΡ‚ΡŒ имя Ρ„Π°ΠΉΠ»Π° ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹; execlp Π²Ρ‹Π±ΠΈΡ€Π°Π΅Ρ‚ ΠΏΡƒΡ‚ΡŒ поиска (Ρ‚.Π΅. $PATH) ΠΈΠ· вашСго окруТСния ΠΈ выполняСт Ρ‚Π°ΠΊΠΎΠΉ ΠΆΠ΅ поиск, ΠΊΠ°ΠΊ shell. Π’Ρ‚ΠΎΡ€ΠΎΠΉ ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ β€” это ΠΈΠΌΠ΅Π½Π° ΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΊΠΎΠΌΠ°Π½Π΄; для Π½ΠΎΠ²ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΎΠ½ΠΈ становятся массивом argv. ΠšΠΎΠ½Π΅Ρ† списка ΠΎΡ‚ΠΌΠ΅Ρ‡Π΅Π½ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ 0. (Π‘ΠΌ. справочноС руководство ΠΏΠΎ exec(2), ΠΈ Π²Ρ‹ ΠΏΠΎΠΉΠΌΠ΅Ρ‚Π΅ ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ execlp.)

Π’Ρ‹Π·ΠΎΠ² execlp ΠΏΠ΅Ρ€Π΅ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π½ΠΎΠ²ΠΎΠΉ, запускаСт Π΅Π΅ ΠΈ Π·Π°Ρ‚Π΅ΠΌ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ. ΠŸΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½Π°Ρ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠΈ ошибки, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠΎΠ³Π΄Π° Ρ„Π°ΠΉΠ» Π½Π΅ удаСтся Π½Π°ΠΉΡ‚ΠΈ ΠΈΠ»ΠΈ ΠΎΠ½ являСтся Π½Π΅Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠΌΡ‹ΠΌ:

execlp("date", "date", (char*)0);

fprintf(stderr, "НС ΡƒΠ΄Π°Π»ΠΎΡΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ 'date'\n");

exit(1);

Если число Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Π²Π°ΠΌ Π·Π°Ρ€Π°Π½Π΅Π΅ Π½Π΅ извСстно, ΠΏΠΎΠ»Π΅Π·Π½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ execvp (Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ execlp). Π’Ρ‹Π·ΠΎΠ² выглядит Ρ‚Π°ΠΊ:

execvp(filename, argp);

Π³Π΄Π΅ argp ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ массив ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΊ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌ (Ρ‚Π°ΠΊΠΈΠΌ, ΠΊΠ°ΠΊ argv). ПослСдним Π² массивС Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ NULL, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ execvp ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ ΠΊΠΎΠ½Π΅Ρ† списка. Как ΠΈ для execlp, filename β€” это Ρ„Π°ΠΉΠ», Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ находится ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, argp β€” массив argv для Π½ΠΎΠ²ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, a argp[0] β€” имя ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

Ни ΠΎΠ΄Π½Π° ΠΈΠ· пСрСчислСнных Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ Π½Π΅ обСспСчиваСт Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ Π² спискС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² мСтасимволов Ρ‚ΠΈΠΏΠ° <, >, *, ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠΈ ΠΈ Ρ‚.ΠΏ. Если ΠΎΠ½ΠΈ Π²Π°ΠΌ Π½ΡƒΠΆΠ½Ρ‹, Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ΡΡŒ execlp ΠΈ Π²Ρ‹Π·ΠΎΠ²ΠΈΡ‚Π΅ /bin/sh ΠΈΠ· shell, которая Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ эту Ρ€Π°Π±ΠΎΡ‚Ρƒ. БконструируйтС строку commandline, ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‰ΡƒΡŽ ΠΏΠΎΠ»Π½ΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ, ΠΊΠ°ΠΊ Ссли Π±Ρ‹ ΠΎΠ½Π° Π±Ρ‹Π»Π° Π½Π°ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π½Π° Π½Π° Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π΅, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

execlp("/bin/sh/", "sh", "-с", commandline, (char*)0);

АргумСнт -с прСдписываСт Ρ‚Ρ€Π°ΠΊΡ‚ΠΎΠ²Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ ΠΊΠ°ΠΊ Ρ†Π΅Π»ΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΡƒΡŽ строку.

Π’ качСствС ΠΈΠ»Π»ΡŽΡΡ‚Ρ€Π°Ρ†ΠΈΠΈ exec рассмотрим ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ waitfile. Команда

$ waitfile filename [command]

пСриодичСски провСряСт ΠΏΠΎΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ». Если ΠΎΠ½ Π½Π΅ мСнялся послС послСднСй ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ, выполняСтся command. Π’ Ρ‚ΠΎΠΌ случаС, ΠΊΠΎΠ³Π΄Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½Π°, Ρ„Π°ΠΉΠ» копируСтся Π² стандартный Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ. Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ waitfile ΠΌΡ‹ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΡƒΠ΅ΠΌ Ρ€Π°Π±ΠΎΡ‚Ρƒ troff, ΠΊΠ°ΠΊ Π²

$ waitfile troff .out echo troff done &

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° waitfile ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ fstat, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ΡΠ²ΠΈΡ‚ΡŒ врСмя послСднСго измСнСния Ρ„Π°ΠΉΠ»Π°.

/* waitfile: wait until file stops changing */

#include <stdio.h>

#include <sys/types.h>

#include <sys/stat.h>

char *progname;


main(argc, argv)

 int argc;

 char *argv[];

{

 int fd;

 struct stat stbuf;

 time_t old_time = 0;


 progname = argv[0];

 if (argc < 2)

  error("Usage: %s filename [cmd]", progname);

 if ((fd = open(argv[1], 0)) == -1)

  error("can't open %s", argv[1]);

 fstat(fd, &stbuf);

 while(stbuf.st_mtime != old_time) {

  old_time = stbuf.st_mtime;

  sleep(60);

  fstat(fd, &stbuf);

 }

 if (argc == 2) { /* copy file */

  execlp("cat", "cat", argv[1], (char*)0);

  error("can't execute cat %s", argv[1]);

 } else { /* run process */

  execvp(argv[2], &argv[2]);

  error("can't execute %s", argv[2]);

 }

 exit(0);

}

ΠœΡ‹ рассмотрСли ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΊΠ°ΠΊ execlp, Ρ‚Π°ΠΊ ΠΈ execvp. Π­Ρ‚Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π²Ρ‹Π±Ρ€Π°Π½Π° Π² качСствС ΠΈΠ»Π»ΡŽΡΡ‚Ρ€Π°Ρ†ΠΈΠΈ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½Π° вСсьма ΠΏΠΎΠ»Π΅Π·Π½Π°, Π½ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹. Π’Π°ΠΊ, waitfile ΠΌΠΎΠ³Π»Π° Π±Ρ‹ просто Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒΡΡ ΠΏΠΎ ΠΎΠΊΠΎΠ½Ρ‡Π°Π½ΠΈΠΈ измСнСния Ρ„Π°ΠΉΠ»Π°.

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 7.17

ΠœΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΠΉΡ‚Π΅ watchfile (ΡƒΠΏΡ€. 7.12) Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½Π° ΠΈΠΌΠ΅Π»Π° Ρ‚ΠΎ ΠΆΠ΅ свойство, Ρ‡Ρ‚ΠΎ ΠΈ waitfile: Π² отсутствиС command копируСтся Ρ„Π°ΠΉΠ», Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС выполняСтся ΠΊΠΎΠΌΠ°Π½Π΄Π°. Могли Π±Ρ‹ watchfile ΠΈ waitfile Ρ€Π°Π·Π΄Π΅Π»ΡΡ‚ΡŒ ΠΈΡΡ…ΠΎΠ΄Π½ΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ? Подсказка: argv[0].

Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ процСссами: fork ΠΈ wait

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ шаг β€” вновь ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ послС запуска ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ execlp ΠΈ execvp. Π’Π°ΠΊ ΠΊΠ°ΠΊ эти ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ просто "ΠΏΠ΅Ρ€Π΅ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‚" ΡΡ‚Π°Ρ€ΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π½ΠΎΠ²ΠΎΠΉ, для сохранСния старой трСбуСтся сначала Ρ€Π°Π·Π±ΠΈΡ‚ΡŒ Π΅Π΅ Π½Π° Π΄Π²Π΅ ΠΊΠΎΠΏΠΈΠΈ. Одна ΠΈΠ· ΠΊΠΎΠΏΠΈΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΊΡ€Ρ‹Ρ‚Π°, Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ другая ΠΆΠ΄Π΅Ρ‚ Π½ΠΎΠ²ΡƒΡŽ, ΠΏΠ΅Ρ€Π΅ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰ΡƒΡŽ Π΅Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒΡΡ. Π Π°Π·Π±ΠΈΠ΅Π½ΠΈΠ΅ выполняСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ систСмного Π²Ρ‹Π·ΠΎΠ²Π° fork:

proc_id = fork();

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° разбиваСтся Π½Π° Π΄Π²Π΅ ΠΊΠΎΠΏΠΈΠΈ, каТдая ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ. Они ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ лишь Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹ΠΌ fork, β€” Π½ΠΎΠΌΠ΅Ρ€ΠΎΠΌ процСсса process-id. Π’ ΠΏΠ΅Ρ€Π²ΠΎΠΌ процСссС (ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ΅) proc_id Ρ€Π°Π²Π΅Π½ Π½ΡƒΠ»ΡŽ, Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ (Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠΌ) proc_id Π΅ΡΡ‚ΡŒ Π½ΠΎΠΌΠ΅Ρ€ процСсса-ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ°. Π˜Ρ‚Π°ΠΊ, Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ ΠΈ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒΡΡ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

if (fork() == 0)

 execlp("/bin/sh", "sh", "-с", commandline, (char*)0);

ЀактичСски этого достаточно, Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ошибок. Fork Π΄Π΅Π»Π°Π΅Ρ‚ Π΄Π²Π΅ ΠΊΠΎΠΏΠΈΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π’ процСссС-ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ΅ fork Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π½ΡƒΠ»ΡŒ, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΎΠ½ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ execlp, которая выполняСт commandline ΠΈ Π·Π°Ρ‚Π΅ΠΌ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ. Π’ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠΌ процСссС fork Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π½Π΅ Π½ΡƒΠ»ΡŒ, поэтому execlp пропускаСтся. (ΠŸΡ€ΠΈ Π½Π°Π»ΠΈΡ‡ΠΈΠΈ ошибки fork Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ -1-)

Π§Π°Ρ‰Π΅ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ процСсс ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚, ΠΏΠΎΠΊΠ° ΠΏΠΎΡ‚ΠΎΠΌΠΎΠΊ Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΡ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ, ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ своС Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅, для Ρ‡Π΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ систСмный Π²Ρ‹Π·ΠΎΠ² wait:

int status;


if (fork() == 0)

 execlp(...); /* ΠΏΠΎΡ‚ΠΎΠΌΠΎΠΊ */

wait(&status); /* Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ */

Однако ΠΏΡ€ΠΈ этом Π½Π΅ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ошибки, Ρ‚Π°ΠΊΠΈΠ΅, ΠΊΠ°ΠΊ сбои execlp ΠΈ fork, ΠΈΠ»ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… процСссов-ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠ² (wait Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π½ΠΎΠΌΠ΅Ρ€ Π·Π°Π²Π΅Ρ€ΡˆΠΈΠ²ΡˆΠ΅Π³ΠΎΡΡ процСсса-ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ°, Ссли Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΡΡ€Π°Π²Π½ΠΈΡ‚ΡŒ Π΅Π³ΠΎ со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½Π½Ρ‹ΠΌ fork). Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ эти Ρ‚Ρ€ΠΈ строки ΡΠ²Π»ΡΡŽΡ‚ΡΡ сСрдцСвиной стандартной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ system.

Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ status, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ wait, содСрТит Π² своих ΠΌΠ»Π°Π΄ΡˆΠΈΡ… восьми разрядах систСмноС прСдставлСниС ΠΊΠΎΠ΄Π° Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ процСсса-ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ°; ΠΎΠ½ΠΎ Ρ€Π°Π²Π½ΠΎ Π½ΡƒΠ»ΡŽ ΠΏΡ€ΠΈ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎΠΌ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ ΠΈ Π½Π΅ Ρ€Π°Π²Π½ΠΎ Π½ΡƒΠ»ΡŽ ΠΏΡ€ΠΈ Ρ€Π°Π·Π½ΠΎΠ³ΠΎ Ρ€ΠΎΠ΄Π° затруднСниях. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΡΡ‚Π°Ρ€ΡˆΠΈΠ΅ восСмь Π±ΠΈΡ‚ΠΎΠ² бСрутся ΠΈΠ· Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° Π²Ρ‹Π·ΠΎΠ²Π° exit ΠΈΠ»ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ΡΡ ΠΈΠ· main, которая Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΎΠΊΠΎΠ½Ρ‡Π°Π½ΠΈΠ΅ выполнСния процСсса-ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ°.

Если ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° вызываСтся ΠΈΠ· shell, Ρ‚Ρ€ΠΈ дСскриптора Ρ„Π°ΠΉΠ»Π°, 0, 1 ΠΈ 2, ΡΡΡ‹Π»Π°ΡŽΡ‚ΡΡ Π½Π° ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Ρ„Π°ΠΉΠ»Ρ‹, ΠΈ всС ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ дСскрипторы доступны для использования. Когда эта ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Π΄Ρ€ΡƒΠ³ΡƒΡŽ, Π² соотвСтствии с ΠΏΡ€ΠΎΡ„Π΅ΡΡΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠΉ этикой ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Π΅ условия Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΡΠΎΠ±Π»ΡŽΠ΄Π΅Π½Ρ‹. Ни fork, Π½ΠΈ exec Π½Π΅ Π²Π»ΠΈΡΡŽΡ‚ Π½ΠΈΠΊΠΎΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π½Π° ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹; ΠΎΠ±Π° процСсса, Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ ΠΈ ΠΏΠΎΡ‚ΠΎΠΌΠΎΠΊ, ΠΈΠΌΠ΅ΡŽΡ‚ ΠΎΠ΄Π½ΠΈ ΠΈ Ρ‚Π΅ ΠΆΠ΅ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹. Если процСсс-Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ Π±ΡƒΡ„Π΅Ρ€ΠΈΠ·ΡƒΠ΅Ρ‚ Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ вывСсти Π΄ΠΎ процСсса-ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ°, Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΡ‡ΠΈΡΡ‚ΠΈΡ‚ΡŒ свой Π±ΡƒΡ„Π΅Ρ€ Ρ€Π°Π½Π΅Π΅ execlp. И, Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚, ΠΏΡ€ΠΈ Π±ΡƒΡ„Π΅Ρ€ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»Π΅ΠΌ Π²Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΏΠΎΡ‚ΠΎΠΌΠΎΠΊ потСряСт ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ, которая Ρ‡ΠΈΡ‚Π°Π»Π°ΡΡŒ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»Π΅ΠΌ. Π’Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹Π²Π΅Π΄Π΅Π½, Π½ΠΎ Π²Ρ…ΠΎΠ΄Π½ΠΎΠΉ нСльзя "ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚ΡŒ Π½Π°Π·Π°Π΄". ОбС ситуации ΡΠ²Π»ΡΡŽΡ‚ΡΡ слСдствиСм Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π²Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ»ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π°, ΠΎΠ±ΡΡƒΠΆΠ΄Π°Π²ΡˆΠ΅ΠΉΡΡ Π² Π³Π». 6, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΡ€ΠΈ этом ΠΈ Π²Π²ΠΎΠ΄, ΠΈ Π²Ρ‹Π²ΠΎΠ΄ Π±ΡƒΡ„Π΅Ρ€ΠΈΠ·ΡƒΡŽΡ‚ΡΡ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ.