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, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΏΡΠΈ ΡΡΠΎΠΌ ΠΈ Π²Π²ΠΎΠ΄, ΠΈ Π²ΡΠ²ΠΎΠ΄ Π±ΡΡΠ΅ΡΠΈΠ·ΡΡΡΡΡ ΠΎΠ±ΡΡΠ½ΡΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ.