mmap(NULL, alloc_size, PROT_WRITE, MAP_PRIVATE, fd, 0);
close(fd);
/* ΠΠ°ΠΏΠΈΡΡ Π½Π° ΡΡΡΠ°Π½ΠΈΡΡ Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ Π΅Π΅ ΠΊΠΎΠΏΠΈΠΈ Π² ΡΠ°ΡΡΠ½ΠΎΠ΅
ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅. */
memory[0] = 0;
/* ΠΠ°ΠΏΡΠ΅Ρ Π½Π° Π·Π°ΠΏΠΈΡΡ Π² ΠΏΠ°ΠΌΡΡΡ. */
mprotect(memory, alloc_size, PROT_NONE);
/* ΠΠΎΠΏΡΡΠΊΠ° Π·Π°ΠΏΠΈΡΠΈ Π² ΠΏΠ°ΠΌΡΡΡ. */
memory[0] = 1;
/* Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΏΠ°ΠΌΡΡΠΈ. */
printf("all done\n");
munmap(memory, alloc_size);
return 0;
}
ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΠΏΠΎ ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ ΡΡ Π΅ΠΌΠ΅.
1. ΠΠ°Π΄Π°Π΅ΡΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΡΠΈΠ³Π½Π°Π»Π° SIGSEGV.
2. Π€Π°ΠΉΠ» /dev/zero ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅ΡΡΡ Π² ΠΏΠ°ΠΌΡΡΠΈ, ΠΈΠ· ΠΊΠΎΡΠΎΡΠΎΠΉ Π²ΡΠ΄Π΅Π»ΡΠ΅ΡΡΡ ΠΎΠ΄Π½Π° ΡΡΡΠ°Π½ΠΈΡΠ°. Π ΡΡΡ ΡΡΡΠ°Π½ΠΈΡΡ Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅ΡΡΡ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΡΡΠ΅Π΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, Π±Π»Π°Π³ΠΎΠ΄Π°ΡΡ ΡΠ΅ΠΌΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅ΡΡΡ ΡΠ°ΡΡΠ½Π°Ρ ΠΊΠΎΠΏΠΈΡ ΡΡΡΠ°Π½ΠΈΡΡ.
3. ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π·Π°ΡΠΈΡΠ°Π΅Ρ ΠΏΠ°ΠΌΡΡΡ, Π²ΡΠ·ΡΠ²Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ mprotect() Ρ ΡΠ»Π°Π³ΠΎΠΌ PROT_NONE.
4. ΠΠΎΠ³Π΄Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π²ΠΏΠΎΡΠ»Π΅Π΄ΡΡΠ²ΠΈΠΈ ΠΎΠ±ΡΠ°ΡΠ°Π΅ΡΡΡ ΠΊ ΠΏΠ°ΠΌΡΡΠΈ, Linux ΠΏΠΎΡΡΠ»Π°Π΅Ρ Π΅ΠΉ ΡΠΈΠ³Π½Π°Π» SIGSEGV, ΠΊΠΎΡΠΎΡΡΠΉ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅ΡΡΡ Π² ΡΡΠ½ΠΊΡΠΈΠΈ segv_handler(). ΠΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΡΠΈΠ³Π½Π°Π»Π° ΠΎΡΠΌΠ΅Π½ΡΠ΅Ρ Π·Π°ΡΠΈΡΡ ΠΏΠ°ΠΌΡΡΠΈ, ΡΠ°Π·ΡΠ΅ΡΠ°Ρ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ Π·Π°ΠΏΠΈΡΠΈ.
5. ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΡΠ΄Π°Π»ΡΠ΅Ρ ΠΎΠ±Π»Π°ΡΡΡ ΠΏΠ°ΠΌΡΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ munmap().
8.10. Π€ΡΠ½ΠΊΡΠΈΡ nanosleep(): Π²ΡΡΠΎΠΊΠΎΡΠΎΡΠ½Π°Ρ ΠΏΠ°ΡΠ·Π°
Π€ΡΠ½ΠΊΡΠΈΡ nanosleep() ΡΠ²Π»ΡΠ΅ΡΡΡ Π±ΠΎΠ»Π΅Π΅ ΡΠΎΡΠ½ΠΎΠΉ Π²Π΅ΡΡΠΈΠ΅ΠΉ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ sleep(), ΠΏΡΠΈΠ½ΠΈΠΌΠ°Ρ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΡΡΡΡΠΊΡΡΡΡ ΡΠΈΠΏΠ° timespec, Π³Π΄Π΅ Π²ΡΠ΅ΠΌΡ Π·Π°Π΄Π°Π΅ΡΡΡ Ρ ΡΠΎΡΠ½ΠΎΡΡΡΡ Π΄ΠΎ Π½Π°Π½ΠΎΡΠ΅ΠΊΡΠ½Π΄Ρ, Π° Π½Π΅ ΡΠ΅ΠΊΡΠ½Π΄Ρ. ΠΡΠ°Π²Π΄Π°, ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡΠΈ ΡΠ°Π±ΠΎΡΡ ΠΠ‘ Linux ΡΠ°ΠΊΠΎΠ²Ρ, ΡΡΠΎ ΡΠ΅Π°Π»ΡΠ½Π°Ρ ΡΠΎΡΠ½ΠΎΡΡΡ ΠΎΠΊΠ°Π·ΡΠ²Π°Π΅ΡΡΡ ΡΠ°Π²Π½ΠΎΠΉ 10 ΠΌΡ, Π½ΠΎ ΡΡΠΎ Π²ΡΠ΅ ΡΠ°Π²Π½ΠΎ Π²ΡΡΠ΅, ΡΠ΅ΠΌ Π² ΡΡΠ½ΠΊΡΠΈΠΈ sleep(). Π€ΡΠ½ΠΊΡΠΈΡ nanosleep() ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΡ , Π³Π΄Π΅ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ Π·Π°ΠΏΡΡΠΊΠ°ΡΡ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Ρ ΠΊΠΎΡΠΎΡΠΊΠΈΠΌΠΈ ΠΈΠ½ΡΠ΅ΡΠ²Π°Π»Π°ΠΌΠΈ ΠΌΠ΅ΠΆΠ΄Ρ Π½ΠΈΠΌΠΈ.
Π ΡΡΡΡΠΊΡΡΡΠ΅ timespec ΠΈΠΌΠ΅ΡΡΡΡ Π΄Π²Π° ΠΏΠΎΠ»Ρ:
β tv_sΠ΅Ρ β ΡΠ΅Π»ΠΎΠ΅ ΡΠΈΡΠ»ΠΎ ΡΠ΅ΠΊΡΠ½Π΄;
β tv_nsec β Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎΠ΅ ΡΠΈΡΠ»ΠΎ ΠΌΠΈΠ»Π»ΠΈΡΠ΅ΠΊΡΠ½Π΄ (Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±ΡΡΡ ΠΌΠ΅Π½ΡΡΠ΅, ΡΠ΅ΠΌ 109).
Π Π°Π±ΠΎΡΠ° ΡΡΠ½ΠΊΡΠΈΠΈ nanosleep(), ΠΊΠ°ΠΊ ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ sleep(), ΠΏΡΠ΅ΡΡΠ²Π°Π΅ΡΡΡ ΠΏΡΠΈ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΠΈ ΡΠΈΠ³Π½Π°Π»Π°. ΠΡΠΈ ΡΡΠΎΠΌ ΡΡΠ½ΠΊΡΠΈΡ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ -1, Π° Π² ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ errno Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅ΡΡΡ ΠΊΠΎΠ΄ EINTR. ΠΠΎ Ρ ΡΡΠ½ΠΊΡΠΈΠΈ nanosleep() Π΅ΡΡΡ Π²Π°ΠΆΠ½ΠΎΠ΅ ΠΏΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²ΠΎ. ΠΠ½Π° ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠΉ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ β Π΅ΡΠ΅ ΠΎΠ΄ΠΈΠ½ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΡΡΡΡΠΊΡΡΡΡ timespec, Π² ΠΊΠΎΡΠΎΡΡΡ (Π΅ΡΠ»ΠΈ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π΅ ΡΠ°Π²Π΅Π½ NULL) Π·Π°Π½ΠΎΡΠΈΡΡΡ Π²Π΅Π»ΠΈΡΠΈΠ½Π° ΠΎΡΡΠ°Π²ΡΠ΅Π³ΠΎΡΡ ΠΈΠ½ΡΠ΅ΡΠ²Π°Π»Π° Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ (Ρ.Π΅. ΡΠ°Π·Π½ΠΈΡΠ° ΠΌΠ΅ΠΆΠ΄Ρ Π·Π°ΠΏΡΠ°ΡΠΈΠ²Π°Π΅ΠΌΡΠΌ ΠΈ ΠΏΡΠΎΡΠ΅Π΄ΡΠΈΠΌ ΠΏΡΠΎΠΌΠ΅ΠΆΡΡΠΊΠ°ΠΌΠΈ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ). ΠΠ»Π°Π³ΠΎΠ΄Π°ΡΡ ΡΡΠΎΠΌΡ ΠΌΠΎΠΆΠ½ΠΎ Π»Π΅Π³ΠΊΠΎ Π²ΠΎΠ·ΠΎΠ±Π½ΠΎΠ²Π»ΡΡΡ ΠΏΡΠ΅ΡΠ²Π°Π½Π½ΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ.
Π Π»ΠΈΡΡΠΈΠ½Π³Π΅ 8.8 ΠΏΠΎΠΊΠ°Π·Π°Π½Π° Π°Π»ΡΡΠ΅ΡΠ½Π°ΡΠΈΠ²Π½Π°Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΈ sleep(). Π ΠΎΡΠ»ΠΈΡΠΈΠ΅ ΠΎΡ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎΠ³ΠΎ ΡΠΈΡΡΠ΅ΠΌΠ½ΠΎΠ³ΠΎ Π²ΡΠ·ΠΎΠ²Π° ΡΡΠ° ΡΡΠ½ΠΊΡΠΈΡ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡ Π΄ΡΠΎΠ±Π½ΠΎΠ΅ ΡΠΈΡΠ»ΠΎ ΡΠ΅ΠΊΡΠ½Π΄ ΠΈ Π²ΠΎΠ·ΠΎΠ±Π½ΠΎΠ²Π»ΡΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ Π² ΡΠ»ΡΡΠ°Π΅ ΠΏΡΠ΅ΡΡΠ²Π°Π½ΠΈΡ ΠΏΠΎ ΡΠΈΠ³Π½Π°Π»Ρ.
ΠΠΈΡΡΠΈΠ½Π³ 8.8. (better_sleep.c) ΠΡΡΠΎΠΊΠΎΡΠΎΡΠ½Π°Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΈ sleep()#include <errno.h>
#include <time.h>
int better_sleep(double sleep_time) {
struct timespec tv;
/* ΠΠ°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΡΡΡΡΠΊΡΡΡΡ timespec Π½Π° ΠΎΡΠ½ΠΎΠ²Π°Π½ΠΈΠΈ ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ ΡΠΈΡΠ»Π°
ΡΠ΅ΠΊΡΠ½Π΄. */
tv.tv_sec = (time_t)sleep_time;
/* Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π΅ΡΡΡΠ΅Π½Π½ΡΡ Π²ΡΡΠ΅ Π½Π°Π½ΠΎΡΠ΅ΠΊΡΠ½Π΄. */
tv.tv_nsec = (long)((sleep_time - tv.tv_sec) * 1e+9);
while (1) {
/* ΠΠ°ΡΠ·Π°, Π΄Π»ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ ΠΊΠΎΡΠΎΡΠΎΠΉ ΡΠΊΠ°Π·Π°Π½Π° Π² ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ tv.
Π ΡΠ»ΡΡΠ°Π΅ ΠΏΡΠ΅ΡΡΠ²Π°Π½ΠΈΡ ΠΏΠΎ ΡΠΈΠ³Π½Π°Π»Ρ Π²Π΅Π»ΠΈΡΠΈΠ½Π° ΠΎΡΡΠ°Π²ΡΠ΅Π³ΠΎΡΡ
ΠΏΡΠΎΠΌΠ΅ΠΆΡΡΠΊΠ° Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π·Π°Π½ΠΎΡΠΈΡΡΡ ΠΎΠ±ΡΠ°ΡΠ½ΠΎ Π² ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ tv. */
int rval = nanosleep(&tv, &tv);
if (rval == 0)
/* ΠΏΠ°ΡΠ·Π° ΡΡΠΏΠ΅ΡΠ½ΠΎ ΠΎΠΊΠΎΠ½ΡΠ΅Π½Π°. */
return 0;
else if (errno == EINTR)
/* ΠΡΠ΅ΡΡΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎ ΡΠΈΠ³Π½Π°Π»Ρ. ΠΠΎΠ²ΡΠΎΡΠ½Π°Ρ ΠΏΠΎΠΏΡΡΠΊΠ°. */
continue;
else
/* ΠΠ°ΠΊΠ°Ρ-ΡΠΎ Π΄ΡΡΠ³Π°Ρ ΠΎΡΠΈΠ±ΠΊΠ°. */
return rval;
}
return 0;
}
8.11. Π€ΡΠ½ΠΊΡΠΈΡ readlink(): ΡΡΠ΅Π½ΠΈΠ΅ ΡΠΈΠΌΠ²ΠΎΠ»ΠΈΡΠ΅ΡΠΊΠΈΡ ΡΡΡΠ»ΠΎΠΊ
Π€ΡΠ½ΠΊΡΠΈΡ readlink() ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ Π°Π΄ΡΠ΅ΡΠ°ΡΠ° ΡΠΈΠΌΠ²ΠΎΠ»ΠΈΡΠ΅ΡΠΊΠΎΠΉ ΡΡΡΠ»ΠΊΠΈ. ΠΠ½Π° ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ ΡΡΠΈ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ°: ΠΏΡΡΡ ΠΊ ΡΠΈΠΌΠ²ΠΎΠ»ΠΈΡΠ΅ΡΠΊΠΎΠΉ ΡΡΡΠ»ΠΊΠ΅, Π±ΡΡΠ΅Ρ Π΄Π»Ρ Π·Π°ΠΏΠΈΡΠΈ Π°Π΄ΡΠ΅ΡΠ°ΡΠ° ΠΈ Π΄Π»ΠΈΠ½Π° Π±ΡΡΠ΅ΡΠ°. ΠΠ°ΠΊ Π½ΠΈ ΡΡΡΠ°Π½Π½ΠΎ, ΠΏΡΡΠ΅Π²ΠΎΠ΅ ΠΈΠΌΡ, ΠΏΠΎΠΌΠ΅ΡΠ°Π΅ΠΌΠΎΠ΅ Π² Π±ΡΡΠ΅Ρ, Π½Π΅ Π·Π°Π²Π΅ΡΡΠ°Π΅ΡΡΡ Π½ΡΠ»Π΅Π²ΡΠΌ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠΌ. ΠΠΎ ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π² ΡΡΠ΅ΡΡΠ΅ΠΌ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ΅ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΡΡΡ Π΄Π»ΠΈΠ½Π° Π±ΡΡΠ΅ΡΠ°, Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΡΡΠΎΡ ΡΠΈΠΌΠ²ΠΎΠ» Π½Π΅ΡΠ»ΠΎΠΆΠ½ΠΎ.
ΠΡΠ»ΠΈ ΠΏΠ΅ΡΠ²ΡΠΉ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ Π½Π΅ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠΈΠΌΠ²ΠΎΠ»ΠΈΡΠ΅ΡΠΊΠΎΠΉ ΡΡΡΠ»ΠΊΠΎΠΉ, ΡΡΠ½ΠΊΡΠΈΡ readlink() Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ -1, Π° Π² ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ errno Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅ΡΡΡ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ° EINVAL.
ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°, ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½Π½Π°Ρ Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 8.9, ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ Π°Π΄ΡΠ΅ΡΠ°ΡΠ° ΡΠΈΠΌΠ²ΠΎΠ»ΠΈΡΠ΅ΡΠΊΠΎΠΉ ΡΡΡΠ»ΠΊΠΈ, Π·Π°Π΄Π°Π½Π½ΠΎΠΉ Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠ΅.
ΠΠΈΡΡΠΈΠ½Π³ 8.9. (print-symlink.Ρ) ΠΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ Π°Π΄ΡΠ΅ΡΠ°ΡΠ° ΡΠΈΠΌΠ²ΠΎΠ»ΠΈΡΠ΅ΡΠΊΠΎΠΉ ΡΡΡΠ»ΠΊΠΈ#include Β«errno.h>
#include <stdio.h>
#include <unistd.h>
int main(int argc, char* argv[]) {
char target_path[256];
char* link_path = argv[1];
/* ΠΠΎΠΏΡΡΠΊΠ° ΡΡΠ΅Π½ΠΈΡ Π°Π΄ΡΠ΅ΡΠ°ΡΠ° ΡΠΈΠΌΠ²ΠΎΠ»ΠΈΡΠ΅ΡΠΊΠΎΠΉ ΡΡΡΠ»ΠΊΠΈ. */
int len =
readlink(link_path, target_path, sizeof(target_path));
if (len == -1) {
/* Π€ΡΠ½ΠΊΡΠΈΡ Π·Π°Π²Π΅ΡΡΠΈΠ»Π°ΡΡ ΠΎΡΠΈΠ±ΠΊΠΎΠΉ. */
if (errno == EINVAL)
/* ΠΡΠΎ Π½Π΅ ΡΠΈΠΌΠ²ΠΎΠ»ΠΈΡΠ΅ΡΠΊΠ°Ρ ΡΡΡΠ»ΠΊΠ°. */
fprintf(stderr, "%s is not a symbolic link\n", link_path);
else
/* ΠΡΠΎΠΈΠ·ΠΎΡΠ»Π° ΠΊΠ°ΠΊΠ°Ρ-ΡΠΎ Π΄ΡΡΠ³Π°Ρ ΠΎΡΠΈΠ±ΠΊΠ°. */
perror("readlink");
return 1;
} else {
/* ΠΠ°Π²Π΅ΡΡΠ°Π΅ΠΌ ΠΏΡΡΠ΅Π²ΠΎΠ΅ ΠΈΠΌΡ Π½ΡΠ»Π΅Π²ΡΠΌ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠΌ. */
target_path[len] = '\0';
/* ΠΡΠ²ΠΎΠ΄ΠΈΠΌ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ. */
printf("%s\n", target_path);
return 0;
}
}
ΠΠΈΠΆΠ΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, ΠΊΠ°ΠΊ ΡΠΎΠ·Π΄Π°ΡΡ ΡΠΈΠΌΠ²ΠΎΠ»ΠΈΡΠ΅ΡΠΊΡΡ ΡΡΡΠ»ΠΊΡ ΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ Π΅Π΅ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ print-symlink:
% ln -s /usr/bin/wc my_link
% ./print-symlink my_link
/usr/bin/wc
8.12. Π€ΡΠ½ΠΊΡΠΈΡ sendfile(): Π±ΡΡΡΡΠ°Ρ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠ° Π΄Π°Π½Π½ΡΡ
Π€ΡΠ½ΠΊΡΠΈΡ sendfile() β ΡΡΠΎ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΡΠΉ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π΄Π°Π½Π½ΡΡ ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»ΠΎΠ²ΠΎΠ³ΠΎ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠ° Π² Π΄ΡΡΠ³ΠΎΠΉ. ΠΠ΅ΡΠΊΡΠΈΠΏΡΠΎΡΠ°ΠΌ ΠΌΠΎΠ³ΡΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΎΠ²Π°ΡΡ Π΄ΠΈΡΠΊΠΎΠ²ΡΠ΅ ΡΠ°ΠΉΠ»Ρ, ΡΠΎΠΊΠ΅ΡΡ ΠΈΠ»ΠΈ ΡΡΡΡΠΎΠΉΡΡΠ²Π°.
ΠΠ±ΡΡΠ½ΠΎ ΡΠΈΠΊΠ» ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅ΡΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ. ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π²ΡΠ΄Π΅Π»ΡΠ΅Ρ Π±ΡΡΠ΅Ρ ΡΠΈΠΊΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΡΠ°Π·ΠΌΠ΅ΡΠ°, ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ°Π΅Ρ Π² Π½Π΅Π³ΠΎ Π΄Π°Π½Π½ΡΠ΅ ΠΈΠ· ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠ°, Π·Π°ΡΠ΅ΠΌ Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅Ρ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ Π±ΡΡΠ΅ΡΠ° Π²ΠΎ Π²ΡΠΎΡΠΎΠΉ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ ΠΈ ΠΏΠΎΠ²ΡΠΎΡΡΠ΅Ρ ΠΎΠΏΠΈΡΠ°Π½Π½ΡΡ ΠΏΡΠΎΡΠ΅Π΄ΡΡΡ Π΄ΠΎ ΡΠ΅Ρ ΠΏΠΎΡ, ΠΏΠΎΠΊΠ° Π½Π΅ Π±ΡΠ΄ΡΡ ΡΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½Ρ Π²ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅. Π’Π°ΠΊΠ°Ρ ΡΡ Π΅ΠΌΠ° Π½Π΅ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½Π° ΠΊΠ°ΠΊ Ρ ΡΠΎΡΠΊΠΈ Π·ΡΠ΅Π½ΠΈΡ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ, ΡΠ°ΠΊ ΠΈ Ρ ΡΠΎΡΠΊΠΈ Π·ΡΠ΅Π½ΠΈΡ Π·Π°ΡΡΠ°Ρ ΠΏΠ°ΠΌΡΡΠΈ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π²ΡΠ΄Π΅Π»ΡΠ΅ΡΡΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠΉ Π±ΡΡΠ΅Ρ ΠΈ Π½Π°Π΄ Π΅Π³ΠΎ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΡΠΌ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΡ.
Π€ΡΠ½ΠΊΡΠΈΡ sendfile() ΡΡΡΡΠ°Π½ΡΠ΅Ρ ΠΏΠΎΡΡΠ΅Π±Π½ΠΎΡΡΡ Π² ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ ΠΏΡΠΎΠΌΠ΅ΠΆΡΡΠΎΡΠ½ΠΎΠ³ΠΎ Π±ΡΡΠ΅ΡΠ°. ΠΠΉ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡΡΡ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ Π΄Π»Ρ Π·Π°ΠΏΠΈΡΠΈ, Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ Π΄Π»Ρ ΡΡΠ΅Π½ΠΈΡ, ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΡΠΌΠ΅ΡΠ΅Π½ΠΈΡ ΠΈ ΡΠΈΡΠ»ΠΎ ΠΊΠΎΠΏΠΈΡΡΠ΅ΠΌΡΡ Π΄Π°Π½Π½ΡΡ . ΠΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ ΡΠΌΠ΅ΡΠ΅Π½ΠΈΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ ΠΏΠΎΠ·ΠΈΡΠΈΡ Π²Ρ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π°, Ρ ΠΊΠΎΡΠΎΡΠΎΠΉ Π½Π°ΡΠΈΠ½Π°Π΅ΡΡΡ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ (0 β ΡΡΠΎ Π½Π°ΡΠ°Π»ΠΎ ΡΠ°ΠΉΠ»Π°). ΠΠΎΡΠ»Π΅ ΠΎΠΊΠΎΠ½ΡΠ°Π½ΠΈΡ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ Π±ΡΠ΄Π΅Ρ ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΡ ΡΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅ ΠΊΠΎΠ½ΡΠ° Π±Π»ΠΎΠΊΠ°. Π€ΡΠ½ΠΊΡΠΈΡ sendfile() ΠΎΠ±ΡΡΠ²Π»Π΅Π½Π° Π² ΡΠ°ΠΉΠ»Π΅ <sys/sendfile.h>.
ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°, ΠΏΠΎΠΊΠ°Π·Π°Π½Π½Π°Ρ Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 8.10, ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΠ±ΠΎΠΉ ΠΏΡΠΎΡΡΡΡ, Π½ΠΎ ΠΎΡΠ΅Π½Ρ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΡΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΠ° ΡΠ°ΠΉΠ»ΠΎΠ²ΠΎΠ³ΠΎ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΡ. ΠΠ½Π° ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠ΅ Π΄Π²Π° ΠΈΠΌΠ΅Π½ΠΈ ΡΠ°ΠΉΠ»Π° ΠΈ ΠΊΠΎΠΏΠΈΡΡΠ΅Ρ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ ΠΏΠ΅ΡΠ²ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π° Π²ΠΎ Π²ΡΠΎΡΠΎΠΉ. Π Π°Π·ΠΌΠ΅Ρ ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΡΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ fstat().
ΠΠΈΡΡΠΈΠ½Π³ 8.10. (ΡΠΎΡΡ.Ρ) ΠΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ°ΠΉΠ»Π° Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ sendfile()#include <fcntl.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/sendfile.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
int main(int argc, char* argv[]) {
int read_fd;
int write_fd;
struct stat stat_buf;
off_t offset = 0;
/* ΠΡΠΊΡΡΡΠΈΠ΅ Π²Ρ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π°. */
read_fd = open(argv[1], O_RDONLY);
/* ΠΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΡΠ°Π·ΠΌΠ΅ΡΠ° Π²Ρ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π°. */
fstat(read_fd, &stat_buf);
/* ΠΡΠΊΡΡΡΠΈΠ΅ Π²ΡΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π° Π΄Π»Ρ Π·Π°ΠΏΠΈΡΠΈ. */
write_fd =
open(argv[2], O_WRONLY | O_CREAT, stat_buf.st_mode);
/* ΠΠ΅ΡΠ΅Π΄Π°ΡΠ° Π΄Π°Π½Π½ΡΡ ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π° Π² Π΄ΡΡΠ³ΠΎΠΉ. */
sendfile(write_fd, read_fd, &offset, stat_buf.st_size);
/* ΠΠ°ΠΊΡΡΡΠΈΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ². */
close(read_fd);
close(write_fd);
return 0;
}
Π€ΡΠ½ΠΊΡΠΈΡ sendfile() ΡΠ°ΡΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ ΠΏΠΎΠ²ΡΡΠ΅Π½ΠΈΡ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎΡΡΠΈ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΡ. ΠΠ½Π° ΡΠΈΡΠΎΠΊΠΎ ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΡΡΡ Web-ΡΠ΅ΡΠ²Π΅ΡΠ°ΠΌΠΈ ΠΈ ΡΠ΅ΡΠ΅Π²ΡΠΌΠΈ Π΄Π΅ΠΌΠΎΠ½Π°ΠΌΠΈ, ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΡΡΠΈΠΌΠΈ ΡΠ°ΠΉΠ»Ρ ΠΏΠΎ ΡΠ΅ΡΠΈ ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠΈΠΌ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°ΠΌ. ΠΠ°ΠΏΡΠΎΡ ΠΎΠ±ΡΡΠ½ΠΎ ΠΏΠΎΡΡΡΠΏΠ°Π΅Ρ ΡΠ΅ΡΠ΅Π· ΡΠΎΠΊΠ΅Ρ. Π‘Π΅ΡΠ²Π΅ΡΠ½Π°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΠΎΡΠΊΡΡΠ²Π°Π΅Ρ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΠΉ Π΄ΠΈΡΠΊΠΎΠ²ΡΠΉ ΡΠ°ΠΉΠ», ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅Ρ ΠΈΠ· Π½Π΅Π³ΠΎ Π΄Π°Π½Π½ΡΠ΅ ΠΈ Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅Ρ ΠΈΡ Π² ΡΠΎΠΊΠ΅Ρ. ΠΠ»Π°Π³ΠΎΠ΄Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ sendfile() ΡΡΠ° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ ΡΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΠΎ ΡΡΠΊΠΎΡΡΠ΅ΡΡΡ.
8.13. Π€ΡΠ½ΠΊΡΠΈΡ setitimer(): Π·Π°Π΄Π°Π½ΠΈΠ΅ ΠΈΠ½ΡΠ΅ΡΠ²Π°Π»ΡΠ½ΡΡ ΡΠ°ΠΉΠΌΠ΅ΡΠΎΠ²
Π€ΡΠ½ΠΊΡΠΈΡ setitimer() ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΎΠ±ΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ΠΌ ΡΠΈΡΡΠ΅ΠΌΠ½ΠΎΠ³ΠΎ Π²ΡΠ·ΠΎΠ²Π° alarm(). ΠΠ½Π° ΠΏΠ»Π°Π½ΠΈΡΡΠ΅Ρ Π΄ΠΎΡΡΠ°Π²ΠΊΡ ΡΠΈΠ³Π½Π°Π»Π° ΠΏΠΎ ΠΈΡΡΠ΅ΡΠ΅Π½ΠΈΠΈ Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΡΠΎΠΌΠ΅ΠΆΡΡΠΊΠ° Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ.