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