copy copy.c newcopy.c
copy copy newcopy
ΡΠ²Π»ΡΡΡΡΡ Π΄ΠΎΠΏΡΡΡΠΈΠΌΡΠΌΠΈ. Π‘ΡΡΠ΅ΡΡΠ²ΡΡΡΠΈΠΉ ΡΠ°ΠΉΠ» ΡΠ°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΊΠ°ΡΠ°Π»ΠΎΠ³ΠΎΠΌ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΠΎ Π²ΡΠ·ΠΎΠ²Ρ:
copy . dircontents
ΠΊΠΎΠΏΠΈΡΡΠ΅ΡΡΡ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ ΡΠ΅ΠΊΡΡΠ΅Π³ΠΎ ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π°, ΠΎΠ±ΠΎΠ·Π½Π°ΡΠ΅Π½Π½ΠΎΠ³ΠΎ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠΌ ".", Π² ΠΎΠ±ΡΡΠ½ΡΠΉ ΡΠ°ΠΉΠ» Β«dircontentsΒ»; ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π² Π½ΠΎΠ²ΠΎΠΌ ΡΠ°ΠΉΠ»Π΅ ΡΠΎΠ²ΠΏΠ°Π΄Π°Π΅Ρ, Π²ΠΏΠ»ΠΎΡΡ Π΄ΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π±Π°ΠΉΡΠ°, Ρ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΡΠΌ ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π°, ΡΠΎΠ»ΡΠΊΠΎ ΡΡΠΎΡ ΡΠ°ΠΉΠ» ΠΎΠ±ΡΡΠ½ΠΎΠ³ΠΎ ΡΠΈΠΏΠ° (Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π° ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½Π° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ mknod). ΠΠ°ΠΊΠΎΠ½Π΅Ρ, Π»ΡΠ±ΠΎΠΉ ΠΈΠ· ΡΠ°ΠΉΠ»ΠΎΠ² ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΠ°ΠΉΠ»ΠΎΠΌ ΡΡΡΡΠΎΠΉΡΡΠ²Π°. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°, Π²ΡΠ·Π²Π°Π½Π½Π°Ρ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ:
copy /dev/tty terminalread
ΡΠΈΡΠ°Π΅Ρ ΡΠΈΠΌΠ²ΠΎΠ»Ρ, Π²Π²ΠΎΠ΄ΠΈΠΌΡΠ΅ Ρ ΡΠ΅ΡΠΌΠΈΠ½Π°Π»Π° (ΡΠ°ΠΉΠ» /dev/tty ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΠ΅Ρ ΡΠ΅ΡΠΌΠΈΠ½Π°Π»Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ), ΠΈ ΠΊΠΎΠΏΠΈΡΡΠ΅Ρ ΠΈΡ Π² ΡΠ°ΠΉΠ» terminalread, Π·Π°Π²Π΅ΡΡΠ°Ρ ΡΠ°Π±ΠΎΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π² ΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅, Π΅ΡΠ»ΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π½Π°ΠΆΠΌΠ΅Ρ βΉCtrl/dβΊ. ΠΠΎΡ ΠΎΠΆΠ°Ρ ΡΠΎΡΠΌΠ° Π·Π°ΠΏΡΡΠΊΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ:
copy /dev/tty /dev/tty
Π²ΡΠ·ΡΠ²Π°Π΅Ρ ΡΡΠ΅Π½ΠΈΠ΅ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ² Ρ ΡΠ΅ΡΠΌΠΈΠ½Π°Π»Π° ΠΈ ΠΈΡ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎΠ±ΡΠ°ΡΠ½ΠΎ Π½Π° ΡΠ΅ΡΠΌΠΈΠ½Π°Π».
#include <fcntl.h>
char buffer[2048];
int version = 1; /* Π±ΡΠ΄Π΅Ρ ΠΎΠ±ΡΡΡΠ½Π΅Π½ΠΎ Π² Π³Π»Π°Π²Π΅ 2 */
main(argc, argv)
int argc;
char *argv[];
{
Β int fdold, fdnew;
Β if (argc!= 3)Β
Β {
Β printf("need 2 arguments for copy program\n");
Β exit(1);
Β }
Β fdold = open(argv[1], O_RDONLY); /* ΠΎΡΠΊΡΡΡΡ ΠΈΡΡ
ΠΎΠ΄Π½ΡΠΉ ΡΠ°ΠΉΠ» ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ ΡΡΠ΅Π½ΠΈΡ */
Β if (fdold == -1) {
Β Β printf("cannot open file %s\n", argv[1]);
Β exit(1);
Β }
Β fdnew = creat(argv[2], 0666); /* ΡΠΎΠ·Π΄Π°ΡΡ Π½ΠΎΠ²ΡΠΉ ΡΠ°ΠΉΠ» Ρ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ΠΌ ΡΡΠ΅Π½ΠΈΡ ΠΈ Π·Π°ΠΏΠΈΡΠΈ Π΄Π»Ρ Π²ΡΠ΅Ρ
ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ */
Β if (fdnew == -1)Β
Β {
Β printf("cannot create file %s\n", argv[2]);
Β Β exit(1);
Β }
Β copy(fdold, fdnew);
Β exit(0);
}
copy(old, new)
int old, new;
{
Β int count;
Β while ((count = read(old, buffer, sizeof(buffer))) > 0)
Β write(new, buffer, count);
}
Π ΠΈΡΡΠ½ΠΎΠΊ 1.3. ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΠ°ΠΉΠ»Π°
1.3.2 Π‘ΡΠ΅Π΄Π° Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ²
ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠΎΠΉ Π½Π°Π·ΡΠ²Π°Π΅ΡΡΡ ΠΈΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΡΠΉ ΡΠ°ΠΉΠ», Π° ΠΏΡΠΎΡΠ΅ΡΡΠΎΠΌ Π½Π°Π·ΡΠ²Π°Π΅ΡΡΡ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΈΠ»ΠΈ ΡΠ°ΡΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΏΡΠΈ Π΅Π΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ. Π ΡΠΈΡΡΠ΅ΠΌΠ΅ UNIX ΠΌΠΎΠΆΠ΅Ρ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ² (ΡΡΡ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡΡ ΠΈΠ½ΠΎΠ³Π΄Π° Π½Π°Π·ΡΠ²Π°ΡΡ ΠΌΡΠ»ΡΡΠΈΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΈΠ»ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠ·Π°Π΄Π°ΡΠ½ΡΠΌ ΡΠ΅ΠΆΠΈΠΌΠΎΠΌ), ΠΏΡΠΈ ΡΠ΅ΠΌ ΠΈΡ ΡΠΈΡΠ»ΠΎ Π»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΈ Π½Π΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠΈΠ²Π°Π΅ΡΡΡ, ΠΈ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΡΠ°ΡΡΠ΅ΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ (ΡΠ°ΠΊΠΎΠΉ ΠΊΠ°ΠΊ copy) ΠΌΠΎΠΆΠ΅Ρ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡΡ Π² ΡΠΈΡΡΠ΅ΠΌΠ΅. Π Π°Π·Π»ΠΈΡΠ½ΡΠ΅ ΡΠΈΡΡΠ΅ΠΌΠ½ΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡ ΠΏΡΠΎΡΠ΅ΡΡΠ°ΠΌ ΠΏΠΎΡΠΎΠΆΠ΄Π°ΡΡ Π½ΠΎΠ²ΡΠ΅ ΠΏΡΠΎΡΠ΅ΡΡΡ, Π·Π°Π²Π΅ΡΡΠ°ΡΡ ΠΏΡΠΎΡΠ΅ΡΡΡ, ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·ΠΈΡΡΡΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΡΡΠ°ΠΏΠΎΠ² ΠΏΡΠΎΡΠ΅ΡΡΠ° ΠΈ ΡΠΏΡΠ°Π²Π»ΡΡΡ ΡΠ΅Π°ΠΊΡΠΈΠ΅ΠΉ Π½Π° Π½Π°ΡΡΡΠΏΠ»Π΅Π½ΠΈΠ΅ ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ ΡΠΎΠ±ΡΡΠΈΠΉ. ΠΠ»Π°Π³ΠΎΠ΄Π°ΡΡ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠΌ ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΡΠΌ ΠΊ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΠ΅, ΠΏΡΠΎΡΠ΅ΡΡΡ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎ Π΄ΡΡΠ³ ΠΎΡ Π΄ΡΡΠ³Π°.
ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΡΠΎΡΠ΅ΡΡ, Π²ΡΠΏΠΎΠ»Π½ΡΡΡΠΈΠΉΡΡ Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅, ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΉ Π½Π° Π ΠΈΡΡΠ½ΠΊΠ΅ 1.4, Π·Π°ΠΏΡΡΠΊΠ°Π΅Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ fork, ΡΡΠΎΠ±Ρ ΠΏΠΎΡΠΎΠ΄ΠΈΡΡ Π½ΠΎΠ²ΡΠΉ ΠΏΡΠΎΡΠ΅ΡΡ. ΠΠΎΠ²ΡΠΉ ΠΏΡΠΎΡΠ΅ΡΡ, ΠΈΠΌΠ΅Π½ΡΠ΅ΠΌΡΠΉ ΠΏΠΎΡΠΎΠΆΠ΄Π΅Π½Π½ΡΠΌ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠΌ, ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π° Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ fork, ΡΠ°Π²Π½ΠΎΠ΅ 0, ΠΈ Π°ΠΊΡΠΈΠ²ΠΈΠ·ΠΈΡΡΠ΅Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ execl, ΠΊΠΎΡΠΎΡΠ°Ρ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ copy (Π ΠΈΡΡΠ½ΠΎΠΊ 1.3). ΠΠΏΠ΅ΡΠ°ΡΠΈΡ execl Π·Π°Π³ΡΡΠΆΠ°Π΅Ρ ΡΠ°ΠΉΠ» βcopyβ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΡΠ΅Π»ΡΠ½ΠΎ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ Π² ΡΠ΅ΠΊΡΡΠ΅ΠΌ ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π΅, Π² Π°Π΄ΡΠ΅ΡΠ½ΠΎΠ΅ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ ΠΏΠΎΡΠΎΠΆΠ΄Π΅Π½Π½ΠΎΠ³ΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠ° ΠΈ Π·Π°ΠΏΡΡΠΊΠ°Π΅Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°ΠΌΠΈ, ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΡΠΌΠΈ ΠΎΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ. Π ΡΠ»ΡΡΠ°Π΅ ΡΡΠΏΠ΅ΡΠ½ΠΎΠ³ΠΎ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ execl ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π² Π²ΡΠ·Π²Π°Π²ΡΠΈΠΉ Π΅Π΅ ΠΏΡΠΎΡΠ΅ΡΡ Π½Π΅ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΡΡΡ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΏΡΠΎΡΠ΅ΡΡ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ Π² Π½ΠΎΠ²ΠΎΠΌ Π°Π΄ΡΠ΅ΡΠ½ΠΎΠΌ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π΅ (ΠΏΠΎΠ΄ΡΠΎΠ±Π½Π΅Π΅ ΠΎΠ± ΡΡΠΎΠΌ Π² Π³Π»Π°Π²Π΅ 7). Π’Π΅ΠΌ Π²ΡΠ΅ΠΌΠ΅Π½Π΅ΠΌ, ΠΏΡΠΎΡΠ΅ΡΡ, Π·Π°ΠΏΡΡΡΠΈΠ²ΡΠΈΠΉ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ fork (ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ), ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ Π½Π΅Π½ΡΠ»Π΅Π²ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π° Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ, Π²ΡΠ·ΡΠ²Π°Π΅Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ wait, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΡΠΈΠΎΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ Π΅Π³ΠΎ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π΄ΠΎ ΡΠ΅Ρ ΠΏΠΎΡ, ΠΏΠΎΠΊΠ° Π½Π΅ Π·Π°ΠΊΠΎΠ½ΡΠΈΡΡΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ copy, ΠΈ Π·Π°Π²Π΅ΡΡΠ°Π΅ΡΡΡ (ΠΊΠ°ΠΆΠ΄Π°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΠΈΠΌΠ΅Π΅Ρ Π²ΡΡ ΠΎΠ΄ Π² ΠΊΠΎΠ½ΡΠ΅ Π³Π»Π°Π²Π½ΠΎΠΉ ΠΏΡΠΎΡΠ΅Π΄ΡΡΡ, ΠΏΠΎΡΠ»Π΅ ΠΊΠΎΡΠΎΡΠΎΠΉ ΡΠ°ΡΠΏΠΎΠ»Π°Π³Π°ΡΡΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊ Π‘ΠΈ, ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ°Π΅ΠΌΡΠ΅ Π² ΠΏΡΠΎΡΠ΅ΡΡΠ΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ). ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π΅ΡΠ»ΠΈ ΠΈΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΠ°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π½Π°Π·ΡΠ²Π°Π΅ΡΡΡ run, ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π·Π°ΠΏΡΡΠΊΠ°Π΅Ρ Π΅Π΅ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ:
run oldfile newfile
ΠΡΠΎΡΠ΅ΡΡ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ°ΠΉΠ»Π° Ρ ΠΈΠΌΠ΅Π½Π΅ΠΌ βoldfileβ Π² ΡΠ°ΠΉΠ» Ρ ΠΈΠΌΠ΅Π½Π΅ΠΌ βnewfileβ ΠΈ Π²ΡΠ²ΠΎΠ΄ΠΈΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅. Π₯ΠΎΡΡ Π΄Π°Π½Π½Π°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΠΌΠ°Π»ΠΎ ΡΡΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΠ»Π° ΠΊ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ βcopyβ, Π² Π½Π΅ΠΉ ΠΏΠΎΡΠ²ΠΈΠ»ΠΈΡΡ ΡΠ΅ΡΡΡΠ΅ ΠΎΡΠ½ΠΎΠ²Π½ΡΡ ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΡ ΠΊ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΠ΅, ΡΠΏΡΠ°Π²Π»ΡΡΡΠΈΠ΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ²: fork, exec, wait ΠΈ exit.
main(argc, argv)
int argc;
char *argv[];
{ /* ΠΏΡΠ΅Π΄ΡΡΠΌΠΎΡΡΠ΅Π½ΠΎ 2 Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ°: ΠΈΡΡ
ΠΎΠ΄Π½ΡΠΉ ΡΠ°ΠΉΠ» ΠΈ Π½ΠΎΠ²ΡΠΉ ΡΠ°ΠΉΠ» */
Β if (fork()Β == 0) execl("copy", "copy", argv[1], argv[2], 0);
Β wait((int *)0);
Β printf("copy done\n");
}
Π ΠΈΡΡΠ½ΠΎΠΊ 1.4. ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΠΏΠΎΡΠΎΠΆΠ΄Π΅Π½ΠΈΡ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠ°, Π²ΡΠΏΠΎΠ»Π½ΡΡΡΠ΅Π³ΠΎ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²
ΠΠΎΠΎΠ±ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΠΉ ΠΊ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΠ΅ Π΄Π°Π΅Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, Π²ΡΠΏΠΎΠ»Π½ΡΡΡΠΈΠ΅ ΡΠ»ΠΎΠΆΠ½ΡΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ, ΠΈ ΠΊΠ°ΠΊ ΡΠ»Π΅Π΄ΡΡΠ²ΠΈΠ΅, ΡΠ΄ΡΠΎ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΡ UNIX Π½Π΅ Π²ΠΊΠ»ΡΡΠ°Π΅Ρ Π² ΡΠ΅Π±Ρ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ, ΡΠ²Π»ΡΡΡΠΈΠ΅ΡΡ ΡΠ°ΡΡΡΡ Β«ΡΠ΄ΡΠ°Β» Π² Π΄ΡΡΠ³ΠΈΡ ΡΠΈΡΡΠ΅ΠΌΠ°Ρ . Π’Π°ΠΊΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΈ ΡΡΠ΅Π΄ΠΈ Π½ΠΈΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΡ ΠΈ ΡΠ΅Π΄Π°ΠΊΡΠΎΡΡ, Π² ΡΠΈΡΡΠ΅ΠΌΠ΅ UNIX ΡΠ²Π»ΡΡΡΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°ΠΌΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΎΠ³ΠΎ ΡΡΠΎΠ²Π½Ρ. ΠΠ°ΠΈΠ±ΠΎΠ»Π΅Π΅ Ρ Π°ΡΠ°ΠΊΡΠ΅ΡΠ½ΡΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠΎΠΌ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΌΠΎΠΆΠ΅Ρ ΡΠ»ΡΠΆΠΈΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΡΠΉ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡ shell, Ρ ΠΊΠΎΡΠΎΡΡΠΌ ΠΎΠ±ΡΡΠ½ΠΎ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΡΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΠΈ ΠΏΠΎΡΠ»Π΅ Π²Ρ ΠΎΠ΄Π° Π² ΡΠΈΡΡΠ΅ΠΌΡ. Shell ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠΈΡΡΠ΅Ρ ΠΏΠ΅ΡΠ²ΠΎΠ΅ ΡΠ»ΠΎΠ²ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ ΠΊΠ°ΠΊ ΠΈΠΌΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ: Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ , Π² ΡΠΎΠΌ ΡΠΈΡΠ»Π΅ ΠΈ Π² ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ fork (ΠΏΠΎΡΠΎΠ΄ΠΈΡΡ Π½ΠΎΠ²ΡΠΉ ΠΏΡΠΎΡΠ΅ΡΡ) ΠΈ exec (Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ ΠΏΠΎΡΠΎΠΆΠ΄Π΅Π½Π½ΡΠΉ ΠΏΡΠΎΡΠ΅ΡΡ), ΡΠ°ΠΌΠ° ΠΊΠΎΠΌΠ°Π½Π΄Π° Π°ΡΡΠΎΡΠΈΠΈΡΡΠ΅ΡΡΡ Ρ Π΅Π΅ ΠΈΠΌΠ΅Π½Π΅ΠΌ, Π²ΡΠ΅ ΠΎΡΡΠ°Π»ΡΠ½ΡΠ΅ ΡΠ»ΠΎΠ²Π° Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠ΅ ΡΡΠ°ΠΊΡΡΡΡΡΡ ΠΊΠ°ΠΊ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ.
Shell ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅Ρ ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΡΡΠ΅Ρ ΡΠΈΠΏΠΎΠ². ΠΠΎ-ΠΏΠ΅ΡΠ²ΡΡ , Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΈΠΌΠ΅Π½ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΠΊΠ°Π·Π°Π½ΠΎ ΠΈΠΌΡ ΠΈΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π° Π² ΠΎΠ±ΡΠ΅ΠΊΡΠ½ΠΎΠΌ ΠΊΠΎΠ΄Π΅, ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΠΎΠ³ΠΎ Π² ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠ΅ΠΊΡΡΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π½Π° ΡΠ·ΡΠΊΠ΅ Π‘ΠΈ). ΠΠΎ-Π²ΡΠΎΡΡΡ , ΠΈΠΌΠ΅Π½Π΅ΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΈΠΌΡ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π°, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠ΅Π³ΠΎ Π½Π°Π±ΠΎΡ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΡΡ ΡΡΡΠΎΠΊ, ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅ΠΌΡΡ shell'ΠΎΠΌ. ΠΠ°ΠΊΠΎΠ½Π΅Ρ, ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π²Π½ΡΡΡΠ΅Π½Π½Π΅ΠΉ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ ΡΠ·ΡΠΊΠ° shell (Π² ΠΎΡΠ»ΠΈΡΠΈΠ΅ ΠΎΡ ΠΈΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π°). ΠΠ°Π»ΠΈΡΠΈΠ΅ Π²Π½ΡΡΡΠ΅Π½Π½ΠΈΡ ΠΊΠΎΠΌΠ°Π½Π΄ Π΄Π΅Π»Π°Π΅Ρ shell ΡΠ·ΡΠΊΠΎΠΌ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π² Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊ ΡΡΠ½ΠΊΡΠΈΡΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠ³ΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ°; ΠΊΠΎΠΌΠ°Π½Π΄Π½ΡΠΉ ΡΠ·ΡΠΊ shell Π²ΠΊΠ»ΡΡΠ°Π΅Ρ ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΠΎΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΈΠΈ ΡΠΈΠΊΠ»ΠΎΠ² (for-in-do-done ΠΈ while-do-done), ΠΊΠΎΠΌΠ°Π½Π΄Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΏΠΎ ΡΡΠ»ΠΎΠ²ΠΈΡΠΌ (if-then-else-fi), ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ Π²ΡΠ±ΠΎΡΠ°, ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΡΠ΅ΠΊΡΡΠ΅Π³ΠΎ Π΄Π»Ρ ΠΏΡΠΎΡΠ΅ΡΡΠ° ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π° (cd) ΠΈ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ Π΄ΡΡΠ³ΠΈΠ΅. Π‘ΠΈΠ½ΡΠ°ΠΊΡΠΈΡ shell'Π° Π΄ΠΎΠΏΡΡΠΊΠ°Π΅Ρ ΡΡΠ°Π²Π½Π΅Π½ΠΈΠ΅ Ρ ΠΎΠ±ΡΠ°Π·ΡΠΎΠΌ ΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ². ΠΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΠΌ, Π·Π°ΠΏΡΡΠΊΠ°ΡΡΠΈΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Ρ, Π½Π΅Ρ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ Π·Π½Π°ΡΡ, ΠΊΠ°ΠΊΠΎΠ³ΠΎ ΡΠΈΠΏΠ° ΡΡΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρ.