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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² QNX/Neutrino 2. Руководство ΠΏΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π² QNX Realtime PlatformΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 9

Автор Π ΠΎΠ± ΠšΡ‘Ρ€Ρ‚Π΅Π½

Бписок Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² здСсь β€” список Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки, ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΡ‹Ρ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅.

Π—Π°ΠΌΠ΅Ρ‚ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ Π² Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ языка Π‘ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ spawnlp(), spawnvp() ΠΈ spawnlpe() всС Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ spawnvpe(), которая, Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ POSIX-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ spawnp(). Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ spawnle(), spawnv() ΠΈ spawnl() всС Π² ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌ счСтС Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ spawnve(), которая Π·Π°Ρ‚Π΅ΠΌ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ POSIX-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ spawn(). И, Π½Π°ΠΊΠΎΠ½Π΅Ρ†, POSIX-функция spawnp() Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ POSIX-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ spawn(). Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π² основС всСх возмоТностСй сСмСйства spawn() Π»Π΅ΠΆΠΈΡ‚ сам Π²Ρ‹Π·ΠΎΠ² spawn().

Рассмотрим Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ spawn() ΠΈ exec() Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ смогли ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π½Π°Π²Ρ‹ΠΊ свободного использования Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… суффиксов. Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅ΠΉΠ΄Π΅ΠΌ нСпосрСдствСнно ΠΊ Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Π½ΠΈΡŽ Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ spawn().

Буффикс Β«lΒ»

НапримСр, Ссли я Ρ…ΠΎΡ‡Ρƒ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ ls с Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ -t, -r, ΠΈ -l (ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ β€” Β«ΡΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π² ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ порядкС ΠΈ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ Π² Π΄Π»ΠΈΠ½Π½ΠΎΠΌ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅Β»), я ΠΌΠΎΠ³ Π±Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ это Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Ρ‚Π°ΠΊ:

/* Π’Ρ‹Π·Π²Π°Ρ‚ΡŒ ls ΠΈ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ */

spawnl(P_WAIT, "/bin/ls", "/bin/ls", "-t", "-r", "-l",

 NULL);


/* Π—Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ сСбя Π½Π° ls */

execl(P_WAIT, "/bin/ls", "/bin/ls", "-t", "-r", "-l",

 NULL);

Или, Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ с ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ суффикса v:

char *argv[] = {

 "/bin/ls",

 "-t",

 "-r",

 "-l",

 NULL

};


/* Π’Ρ‹Π·Π²Π°Ρ‚ΡŒ ls ΠΈ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ */

spawnv(P_WAIT, "/bin/ls", argv);


/* Π—Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ сСбя Π½Π° ls */

execv(P_WAIT, "/bin/ls", "/bin/ls", argv);

ΠŸΠΎΡ‡Π΅ΠΌΡƒ ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ‚Π°ΠΊΠΎΠΉ Π²Ρ‹Π±ΠΎΡ€? Он Π΄Π°Π½ для удобства восприятия. Π£ вас ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ синтаксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€, ΡƒΠΆΠ΅ встроСнный Π² Π²Π°ΡˆΡƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ΄ΠΎΠ±Π½ΠΎ сразу ΠΎΠΏΠ΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ массивами строк. Π’ этом случаС я Π±Ρ‹ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΠΎΠ²Π°Π» ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ с суффиксом Β«vΒ». Или Π²Π°ΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ Π·Π°ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π²Ρ‹Π·ΠΎΠ² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΊΠΎΠ³Π΄Π° Π²Π°ΠΌ извСстно, Π³Π΄Π΅ ΠΎΠ½ находится ΠΈ ΠΊΠ°ΠΊΠΈΠ΅ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹. Π’ этом случаС, Π·Π°Ρ‡Π΅ΠΌ Π²Π°ΠΌ ΡƒΡ‚Ρ€ΡƒΠΆΠ΄Π°Ρ‚ΡŒ сСбя созданиСм массива строк, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅ Ρ‚ΠΎΡ‡Π½ΠΎ, ΠΊΠ°ΠΊΠΈΠ΅ Π½ΡƒΠΆΠ½Ρ‹ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹? ΠŸΡ€ΠΎΡΡ‚ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°ΠΉΡ‚Π΅ ΠΈΡ… Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ с суффиксом Β«lΒ».

ΠžΡ‚ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅ΠΌ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ΅ имя ΠΏΡƒΡ‚ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ (/bin/ls), Π° Π·Π°Ρ‚Π΅ΠΌ имя ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π΅Ρ‰Π΅ Ρ€Π°Π· Π² качСствС ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°. Π­Ρ‚ΠΎ дСлаСтся для ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Π΅Π΄ΡƒΡ‚ сСбя ΠΏΠΎ-Ρ€Π°Π·Π½ΠΎΠΌΡƒ Π² зависимости ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, ΠΏΠΎΠ΄ ΠΊΠ°ΠΊΠΈΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ ΠΎΠ½ΠΈ Π±Ρ‹Π»ΠΈ Π²Ρ‹Π·Π²Π°Π½Ρ‹.

НапримСр, GNU-ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ компрСссии ΠΈ дСкомпрСссии (gzip ΠΈ gunzip) фактичСски привязаны ΠΊ ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΈ Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅ исполняСмому ΠΌΠΎΠ΄ΡƒΠ»ΡŽ. Когда исполняСмый ΠΌΠΎΠ΄ΡƒΠ»ΡŒ стартуСт, ΠΎΠ½ Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ argv[0] (ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΡ‹ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ main()) ΠΈ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅, слСдуСт Π»ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΊΠΎΠΌΠΏΡ€Π΅ΡΡΠΈΡŽ ΠΈΠ»ΠΈ Π΄Π΅ΠΊΠΎΠΌΠΏΡ€Π΅ΡΡΠΈΡŽ.

Буффикс Β«Π΅Β»

Π’Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ с суффиксом Β«Π΅Β» ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅. ΠžΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ β€” это Ρ‚ΠΎΠ»ΡŒΠΊΠΎ своСго Ρ€ΠΎΠ΄Π° «контСкст», Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°. НапримСр, Ρƒ вас ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ΠΎΡ€Ρ„ΠΎΠ³Ρ€Π°Ρ„ΠΈΠΈ, Ρƒ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π΅ΡΡ‚ΡŒ эталонный ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ. ВмСсто описания ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС мСстополоТСния словаря Π²Ρ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это Π² ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠΈ:

$ export DICTIONARY=/home/rk/.dict

$ spellcheck document.1

Команда export прСдписываСт ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΌΡƒ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Ρƒ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π½ΠΎΠ²ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ окруТСния (Π² нашСм случаС DICTIONARY) ΠΈ ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ Π΅ΠΉ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ (/home/rk/.dict).

Если Π²Ρ‹ ΠΊΠΎΠ³Π΄Π°-Π»ΠΈΠ±ΠΎ Ρ…ΠΎΡ‚Π΅Π»ΠΈ Π±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ словари, Π²Ρ‹ Π±Ρ‹Π»ΠΈ Π±Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ срСду Π΄ΠΎ выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π­Ρ‚ΠΎ просто ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΈΠ· ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ:

$ export DICTIONARY=/home/rk1.altdict

$ spellcheck document.1

Но ΠΊΠ°ΠΊ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это ΠΈΠ· Π²Π°ΡˆΠΈΡ… собствСнных ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ? Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ Β«eΒ»-вСрсии Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ spawn() ΠΈ exec(), Π²Π°ΠΌ слСдуСт ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ массив строк, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΡ… собой ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅:

char *env[] = {

 "DICTIONARY=/home/rk/.altdict",

 NULL

};


// Запуск ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΌ процСссС:

spawnle(P_WAIT, "/usr/bin/spellcheck",

 "/usr/bin/spellcheck", "documents.1", NULL, env);


// Запуск ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ вмСсто сСбя:

execle("/usr/bin/spellcheck", "/usr/bin/spellcheck",

 "document.1", NULL, env);

Буффикс Β«pΒ»

ВСрсии с суффиксом Β«pΒ» Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΡΠΊΠ°Ρ‚ΡŒ исполняСмый ΠΌΠΎΠ΄ΡƒΠ»ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π² спискС ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ², ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ окруТСния PATH. Π’Ρ‹, вСроятно, ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΠ»ΠΈ, Ρ‡Ρ‚ΠΎ Π²ΠΎ всСх ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… мСстополоТСниС исполняСмых ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ строго ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ β€” /bin/ls ΠΈ /usr/bin/spellcheck. А ΠΊΠ°ΠΊ Π±Ρ‹Ρ‚ΡŒ с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ исполняСмыми модулями? Если Π²Ρ‹ Π½Π΅ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ сразу ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ‚ΠΎΡ‡Π½Ρ‹ΠΉ ΠΏΡƒΡ‚ΡŒ ΠΊ Π½ΡƒΠΆΠ½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅, Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π»ΡƒΡ‡ΡˆΠ΅ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ мСста поиска исполняСмых ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ вашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ сообщил ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ. Бтандартная систСмная пСрСмСнная PATH для этого ΠΈ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π°. НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΎ Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ для минимальной систСмы:

PATH=/proc/boot:/bin

Π­Ρ‚ΠΎ сообщаСт ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΌΡƒ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Ρƒ, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ³Π΄Π° я Π½Π°Π±ΠΈΡ€Π°ΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ, ΠΎΠ½ Π² ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΡ€ΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ /proc/boot/, ΠΈ Ссли Π½Π΅ смоТСт Π½Π°ΠΉΡ‚ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ Ρ‚Π°ΠΌ, Ρ‚ΠΎ Π΄ΠΎΠ»ΠΆΠ½Π° ΠΏΡ€ΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ Π±ΠΈΠ½Π°Ρ€Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² /bin. ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ PATH прСдставляСт собой раздСляСмый двоСточиями список ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ² для поиска ΠΊΠΎΠΌΠ°Π½Π΄. К ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ PATH Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ элСмСнтов, сколько ΠΏΠΎΠΆΠ΅Π»Π°Π΅Ρ‚Π΅, Π½ΠΎ ΠΈΠΌΠ΅ΠΉΡ‚Π΅ Π² Π²ΠΈΠ΄Ρƒ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ поискС Ρ„Π°ΠΉΠ»Π° Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ всС элСмСнты (Π² ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΉ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ).

Если Π²Ρ‹ Π½Π΅ Π·Π½Π°Π΅Ρ‚Π΅ ΠΏΡƒΡ‚ΡŒ ΠΊ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠΌΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ с суффиксом Β«pΒ».

НапримСр:

// ИспользованиС явного ΠΏΡƒΡ‚ΠΈ:

execl("/bin/ls", "/bin/ls", "-l", "-t", "-r", NULL);


// Поиск ΠΏΡƒΡ‚ΠΈ Π² PATH:

execp("ls", "ls", "-l", "-t", "-r", NULL) ;

Если функция execl() Π½Π΅ смоТСт Π½Π°ΠΉΡ‚ΠΈ ls Π² /bin, ΠΎΠ½Π° Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡΡ с ошибкой. Ѐункция execlp() просмотрит всС ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΈ, ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Π΅ Π² PATH, Π² поисках ls, ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡΡ с ошибкой Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Ρ‚ΠΎΠΌ случаС, Ссли Π½Π΅ смоТСт Π½Π°ΠΉΡ‚ΠΈ ls Π½ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΈΠ· этих ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ². Π­Ρ‚ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ прСкрасная Π²Π΅Ρ‰ΡŒ для ΠΌΠ½ΠΎΠ³ΠΎΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ β€” вашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π·Π½Π°Ρ‚ΡŒ ΠΈΠΌΠ΅Π½Π° ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ², принятых Π½Π° Ρ€Π°Π·Π½Ρ‹Ρ… ΠΌΠ°ΡˆΠΈΠ½Π°Ρ…, ΠΎΠ½Π° просто Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ поиск.

А Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚, Ссли ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚Π°ΠΊ?

execlp("/bin/ls", "ls", "-l", "-t", "-r", NULL);

ВыполняСт Π»ΠΈ этот Π²Ρ‹Π·ΠΎΠ² поиск Π² ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠΈ? НСт. Π’Ρ‹ явно ΡƒΠΊΠ°Π·Π°Π»ΠΈ execlp() имя ΠΏΡƒΡ‚ΠΈ, Ρ‡Ρ‚ΠΎ отмСняСт ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ поиска Π² PATH. Если ls Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°ΠΉΠ΄Π΅Π½Π° Π² /bin (Π° здСсь это Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ‚Π°ΠΊ), Ρ‚ΠΎ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΠΎΠΏΡ‹Ρ‚ΠΎΠΊ поиска Π½Π΅ выполняСтся β€” эта ситуация ΠΏΠΎΠ΄ΠΎΠ±Π½Π° Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρƒ с использованиСм Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ execl()).

Опасно Π»ΠΈ ΡΠΌΠ΅ΡˆΠΈΠ²Π°Ρ‚ΡŒ явный ΠΏΡƒΡ‚ΡŒ с простым ΠΈΠΌΠ΅Π½Π΅ΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΏΡƒΡ‚ΡŒ ΠΊΠ°ΠΊ /bin/ls, Π° имя β€” ΠΊΠ°ΠΊ ls вмСсто /bin/ls)? ΠžΠ±Ρ‹Ρ‡Π½ΠΎ Π½Π΅Ρ‚, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ:

β€’ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ число ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ Ρ‚Π°ΠΊ ΠΈΠ»ΠΈ ΠΈΠ½Π°Ρ‡Π΅ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΠ΅Ρ‚ argv[0];

β€’ Ρ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… зависит ΠΎΡ‚ ΠΈΡ… ΠΈΠΌΠ΅Π½ΠΈ, ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ basename(), которая удаляСт ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ²ΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ argv[0] ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ имя.

ЕдинствСнная обоснованная ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π° использования ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ ΠΏΡƒΡ‚ΠΈ Π² качСствС ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒ диагностичСскиС сообщСния, содСрТащиС этот ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ ΡƒΠΊΠ°ΠΆΠ΅Ρ‚ Π²Π°ΠΌ, ΠΎΡ‚ΠΊΡƒΠ΄Π° ΠΎΠ½Π° Π±Ρ‹Π»Π° Π²Ρ‹Π·Π²Π°Π½Π°. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π²Π°ΠΆΠ½ΠΎ, Ссли ΠΊΠΎΠΏΠΈΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Ρ€Π°ΡΠΏΠΎΠ»Π°Π³Π°ΡŽΡ‚ΡΡ Π² Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°Ρ… ΠΈΠ· пСрСчислСнных Π² PATH.

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ сСмСйства spawn() ΠΈΠΌΠ΅ΡŽΡ‚ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€; Π²ΠΎ всСх ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Ρ… Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… я всСгда ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π» P_WAIT. Π˜ΠΌΠ΅ΡŽΡ‚ΡΡ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ Ρ„Π»Π°Π³Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΈΠ΄Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ spawn(), Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π΅Π΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅:

P_WAIT Π’Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ процСсс (ваша ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°) Π±ΡƒΠ΄Π΅Ρ‚ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° вновь созданный процСсс Π½Π΅ ΠΎΡ‚Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΈ Π½Π΅ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡΡ. P_NOWAIT Π’Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π°Ρ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π° Π½Π° врСмя выполнСния вновь созданной. Π­Ρ‚ΠΎ позволяСт Π²Π°ΠΌ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π² Ρ„ΠΎΠ½ΠΎΠ²ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅ ΠΈ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Ρ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅, ΠΏΠΎΠΊΠ° ΠΎΠ½Π° Π΄Π΅Π»Π°Π΅Ρ‚ своС Π΄Π΅Π»ΠΎ. P_NOWAITO Аналогично P_NOWAIT Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ устанавливаСтся Ρ„Π»Π°Π³ SPAWN_NOZOMBIE. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Π΅ΡΠΏΠΎΠΊΠΎΠΈΡ‚ΡŒ сСбя Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ waitpid() для очистки ΠΊΠΎΠ΄Π° Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ процСсса. P_OVERLAY Π­Ρ‚ΠΎΡ‚ Ρ„Π»Π°Π³ ΠΏΡ€Π΅Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ spawn() Π² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ Π²Ρ‹Π·ΠΎΠ² exec()! Π’Π°ΡˆΠ° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° прСобразуСтся Π² ΡƒΠΊΠ°Π·Π°Π½Π½ΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π±Π΅Π· измСнСния ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° процСсса ID. Π’ΠΎΠΎΠ±Ρ‰Π΅-Ρ‚ΠΎ, Ссли Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ‚Π°ΠΊ, Ρ‚ΠΎ, Π½Π°Π²Π΅Ρ€Π½ΠΎΠ΅, Π±ΡƒΠ΄Π΅Ρ‚ Π±ΠΎΠ»Π΅Π΅ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π²Ρ‹Π·ΠΎΠ² exec(), ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ это ΠΈΠ·Π±Π°Π²ΠΈΡ‚ Π±ΡƒΠ΄ΡƒΡ‰ΠΈΡ… Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»Π΅ΠΉ Π²Π°ΡˆΠΈΡ… исходных тСкстов ΠΎΡ‚ нСобходимости ΠΈΡΠΊΠ°Ρ‚ΡŒ P_OVERLAY Π² справочном руководствС ΠΏΠΎ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ языка Π‘ΠΈ! ΠŸΡ€ΠΎΡΡ‚ΠΎ spawn()

Как ΠΌΡ‹ упомянули Π²Ρ‹ΡˆΠ΅, всС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ сСмСйства spawn(), Π² ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌ счСтС, Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ Π±Π°Π·ΠΎΠ²ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ spawn(). НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ spawn():