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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«UNIX: взаимодСйствиС процСссов». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 55

Автор Уильям БтивСнс

5  {

6   int pidfd;

7   char line[MAXLINE];

8   /* ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ ΠΈΠ»ΠΈ созданиС Ρ„Π°ΠΉΠ»Π° с ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ процСсса */

9   pidfd = Open(PATH_PIDFILE, O_RDWR | O_CREAT, FILE_MODE);

10  /* ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° блокирования всСго Ρ„Π°ΠΉΠ»Π° Π½Π° запись */

11  if (write_lock(pidfd, 0, SEEK_SET, 0) < 0) {

12   if (errno == EACCES || errno == EAGAIN)

13    err_quit("unable to lock %s, is %s already running?",

14     PATH_PIDFILE, argv[0]);

15   else

16    err_sys("unable to lock %s", PATH_PIDFILE):

17  }

18  /* запись ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°: Ρ„Π°ΠΉΠ» остаСтся ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ Π±Ρ‹Π» Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ */

19  snprintf(line, sizeof(line), "%ld\n", (long) getpid());

20  Ftruncate(pidfd, 0);

21  Write(pidfd, line, strlen(line));

22  /* основной тСкст ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ дСмона… */

23  pause();

24 }

ΠžΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ ΠΈ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»Π°

8-17 Π”Π΅ΠΌΠΎΠ½ создаСт однострочный Ρ„Π°ΠΉΠ», Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ записываСт свой ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ процСсса. Π­Ρ‚ΠΎΡ‚ Ρ„Π°ΠΉΠ» открываСтся ΠΈΠ»ΠΈ создаСтся, Π° Π·Π°Ρ‚Π΅ΠΌ дСлаСтся ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° Π—Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π½Π° запись Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ. Если Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π½Π΅ удаСтся, ΠΌΡ‹ ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ΄ΠΈΠ½ экзСмпляр Π΄Π΅ΠΌΠΎΠ½Π° ΡƒΠΆΠ΅ Π·Π°ΠΏΡƒΡ‰Π΅Π½, поэтому выводится сообщСниС ΠΎΠ± ошибкС ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ.

ΠŸΠ Π˜ΠœΠ•Π§ΠΠΠ˜Π•

Π’ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… вСрсиях Unix Π΄Π΅ΠΌΠΎΠ½Ρ‹ Π·Π°ΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ свои ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ Π² Ρ„Π°ΠΉΠ». Solaris 2.6 Ρ…Ρ€Π°Π½ΠΈΡ‚ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ /etc, a Digital Unix 4.0B ΠΈ BSD/OS β€” Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ /var/run.

Π—Π°ΠΏΠΈΡΡŒ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° процСсса Π² Ρ„Π°ΠΉΠ»

18-21 ΠœΡ‹ ΡƒΠΊΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Π΅ΠΌ Ρ„Π°ΠΉΠ» Π΄ΠΎ 0 Π±Π°ΠΉΡ‚, Π° Π·Π°Ρ‚Π΅ΠΌ записываСм Π² Π½Π΅Π³ΠΎ строку с нашим ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ. ΠŸΡ€ΠΈΡ‡ΠΈΠ½Π°, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π½ΡƒΠΆΠ½ΠΎ ΡƒΠΊΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ», Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ρƒ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ экзСмпляра Π΄Π΅ΠΌΠΎΠ½Π° ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΌΠΎΠ³ Π±Ρ‹Ρ‚ΡŒ прСдставлСн Π±ΠΎΠ»Π΅Π΅ Π΄Π»ΠΈΠ½Π½Ρ‹ΠΌ числом, Ρ‡Π΅ΠΌ Ρƒ Π΄Π°Π½Π½ΠΎΠ³ΠΎ, поэтому Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Π² Ρ„Π°ΠΉΠ»Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒΡΡ смСсь Π΄Π²ΡƒΡ… ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ².

Π’ΠΎΡ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈΠ· листинга 9.8:

solaris % onedaemon&   запускаСм ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ экзСмпляр

[1] 22388

solaris % cat pidfile провСряСм ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€

22388

solaris % onedaemon   пытаСмся Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Π²Ρ‚ΠΎΡ€ΠΎΠΉ экзСмпляр

unable to lock pidfile, is onedaemon already running?

Π‘ΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ способы прСдотвращСния запуска Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… экзСмпляров Π΄Π΅ΠΌΠΎΠ½ΠΎΠ², Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ сСмафоры. ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²ΠΎ Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΠΌ Π΄Π΅ΠΌΠΎΠ½Π°ΠΌ ΠΈ Ρ‚Π°ΠΊ приходится Π·Π°ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ Π² Ρ„Π°ΠΉΠ» свои ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹, Π° ΠΏΡ€ΠΈ досрочном Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π΄Π΅ΠΌΠΎΠ½Π° Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° с Ρ„Π°ΠΉΠ»Π° снимаСтся автоматичСски.

9.8. Π‘Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»ΠΎΠ²

Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚ Posix.1 Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ Ссли функция open вызываСтся с Ρ„Π»Π°Π³Π°ΠΌΠΈ O_CREAT (ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ», Ссли ΠΎΠ½ Π΅Ρ‰Π΅ Π½Π΅ сущСствуСт) ΠΈ O_EXCL (ΠΈΡΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰Π΅Π΅ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅), функция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ, Ссли Ρ„Π°ΠΉΠ» ΡƒΠΆΠ΅ сущСствуСт. Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° сущСствования Ρ„Π°ΠΉΠ»Π° ΠΈ Π΅Π³ΠΎ созданиС (Ссли ΠΎΠ½ Π΅Ρ‰Π΅ Π½Π΅ сущСствуСт) Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ собой Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½ΡƒΡŽ ΠΏΠΎ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡŽ ΠΊ Π΄Ρ€ΡƒΠ³ΠΈΠΌ процСссам ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ создаваСмый Ρ‚Π°ΠΊΠΈΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ Ρ„Π°ΠΉΠ» ΠΊΠ°ΠΊ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ. МоТно Π±Ρ‹Ρ‚ΡŒ ΡƒΠ²Π΅Ρ€Π΅Π½Π½Ρ‹ΠΌ, Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ процСсс смоТСт ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ» (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ), Π° для снятия этой Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Ρ„Π°ΠΉΠ» ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ unlink.

Π’ листингС 9.9 ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ тСкст Π½Π°ΡˆΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ установки ΠΈ снятия Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΡ… этот ΠΌΠ΅Ρ‚ΠΎΠ΄. ΠŸΡ€ΠΈ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ open ΠΌΡ‹ считаСм, Ρ‡Ρ‚ΠΎ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° установлСна, ΠΈ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ возвращаСмся ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ my_lock. Π€Π°ΠΉΠ» ΠΌΡ‹ Π·Π°ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π΅Π³ΠΎ дСскриптор Π½Π°ΠΌ Π½Π΅ Π½ΡƒΠΆΠ΅Π½. О Π½Π°Π»ΠΈΡ‡ΠΈΠΈ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ ΡΠ²ΠΈΠ΄Π΅Ρ‚Π΅Π»ΡŒΡΡ‚Π²ΡƒΠ΅Ρ‚ само сущСствованиС Ρ„Π°ΠΉΠ»Π° Π²Π½Π΅ зависимости ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ ΠΎΠ½ ΠΈΠ»ΠΈ Π½Π΅Ρ‚. Если функция open Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ EEXIST, Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ„Π°ΠΉΠ» сущСствуСт ΠΈ ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π΅Ρ‰Π΅ Ρ€Π°Π· ΠΏΠΎΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ Π΅Π³ΠΎ. 

Π£ этого ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Π΅ΡΡ‚ΡŒ Ρ‚Ρ€ΠΈ нСдостатка.

1. Если процСсс, ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΠ²ΡˆΠΈΠΉ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ, Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡΡ досрочно, Π½Π΅ сняв Π΅Π΅, Ρ„Π°ΠΉΠ» Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠ΄Π°Π»Π΅Π½. Π‘ΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ способы Π±ΠΎΡ€ΡŒΠ±Ρ‹ с этой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ доступа ΠΊ Ρ„Π°ΠΉΠ»Ρƒ ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ Π΅Π³ΠΎ спустя Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΠΊ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, β€” Π½ΠΎ всС ΠΎΠ½ΠΈ Π½Π΅ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½Ρ‹. Π”Ρ€ΡƒΠ³ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² записи Π² Ρ„Π°ΠΉΠ» ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° процСсса, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ процСссы ΠΌΠΎΠ³Π»ΠΈ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π΅Π³ΠΎ ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, сущСствуСт Π»ΠΈ Π΅Ρ‰Π΅ Ρ‚Π°ΠΊΠΎΠΉ процСсс. Π­Ρ‚ΠΎΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ Ρ‚Π°ΠΊΠΆΠ΅ Π½Π΅ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π΅Π½, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ использован ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ.

Π’ Ρ‚Π°ΠΊΠΎΠΉ ситуации Π»ΡƒΡ‡ΡˆΠ΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΎΠΉ fcntl, которая автоматичСски снимаСтся ΠΏΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ процСсса.

2. Если Ρ„Π°ΠΉΠ» ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ ΠΊΠ°ΠΊΠΈΠΌ-Π»ΠΈΠ±ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΠΌ процСссом, ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π΅Ρ‰Π΅ Ρ€Π°Π· Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ open, повторяя эти Π²Ρ‹Π·ΠΎΠ²Ρ‹ Π² бСсконСчном Ρ†ΠΈΠΊΠ»Π΅. Π­Ρ‚ΠΎ называСтся опросом ΠΈ являСтся напрасной Ρ‚Ρ€Π°Ρ‚ΠΎΠΉ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ процСссора. ΠΠ»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ являСтся Π²Ρ‹Π·ΠΎΠ² sleep Π½Π° 1 сСкунду, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ² open (этапроблСма ΠΎΠ±ΡΡƒΠΆΠ΄Π°Π»Π°ΡΡŒ Π² связи с листингом 7.4).

Π­Ρ‚Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Ρ‚Π°ΠΊΠΆΠ΅ исчСзаСт ΠΏΡ€ΠΈ использовании Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ fcntl, Ссли ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ F_SETLKW. Π―Π΄Ρ€ΠΎ автоматичСски приостанавливаСт Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ процСсса Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° рСсурс Π½Π΅ станСт доступСн.

3. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»Π° Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ open ΠΈ unlink ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΡŽ ΠΊ Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмС, Ρ‡Ρ‚ΠΎ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ сущСствСнно большС Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, Ρ‡Π΅ΠΌ Π²Ρ‹Π·ΠΎΠ² fcntl (ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ производится Π΄Π²Π°ΠΆΠ΄Ρ‹: ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· для получСния Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ, Π° Π²Ρ‚ΠΎΡ€ΠΎΠΉ β€” для снятия). ΠŸΡ€ΠΈ использовании fcntl ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ»Π° 10000 ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΠΎΠ² Ρ†ΠΈΠΊΠ»Π° с ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅ΠΌ порядкового Π½ΠΎΠΌΠ΅Ρ€Π° Π² 75 Ρ€Π°Π· быстрСС, Ρ‡Π΅ΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, Π²Ρ‹Π·Ρ‹Π²Π°Π²ΡˆΠ°Ρ open ΠΈ unlink.

Листинг 9.9. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ с использованиСм open с Ρ„Π»Π°Π³Π°ΠΌΠΈ O_CREAT ΠΈ O_EXCL

//lock/lockopen.c

1  #include "unpipc.h"

2  #define LOCKFILE "/tmp/seqno.lock"


3  void

4  my_lock(int fd)

5  {


6   int tempfd;

7   while ((tempfd = open(LOCKFILE, O_RDWR|O_CREAT|O_EXCL, FILE_MODE)) < 0) {

8    if (errno != EEXIST)

9     err_sys("open error for lock file");

10   /* Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° установлСна ΠΊΠ΅ΠΌ-Ρ‚ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΠΌ, повторяСм ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΡƒ */

11  }

12  Close(tempfd); /* ΠΎΡ‚ΠΊΡ€Ρ‹Π»ΠΈ Ρ„Π°ΠΉΠ», Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° установлСна */

13 }


14 void

15 my_unlock(int fd)

16 {

17  Unlink(LOCKFILE); /* снимаСм Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ΠΌ Ρ„Π°ΠΉΠ»Π° */

18 }

Π•ΡΡ‚ΡŒ Π΅Ρ‰Π΅ Π΄Π²Π΅ особСнности Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмы Unix, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ использовались для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ. ΠŸΠ΅Ρ€Π²Π°Ρ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ функция link Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ, Ссли имя Π½ΠΎΠ²ΠΎΠΉ ссылки ΡƒΠΆΠ΅ сущСствуСт. Для получСния Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ создаСтся ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ», ΠΏΠΎΠ»Π½ΠΎΠ΅ имя ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ содСрТит Π² сСбС Π΅Π³ΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ процСсса (ΠΈΠ»ΠΈ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΡŽ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ² процСсса ΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠ°, Ссли трСбуСтся ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡ‚ΡŒ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ). Π—Π°Ρ‚Π΅ΠΌ вызываСтся функция link для создания ссылки Π½Π° этот Ρ„Π°ΠΉΠ» с ΠΊΠ°ΠΊΠΈΠΌ-Π»ΠΈΠ±ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌ Π·Π°Ρ€Π°Π½Π΅Π΅ ΠΈΠΌΠ΅Π½Π΅ΠΌ. ПослС ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ³ΠΎ создания сам Ρ„Π°ΠΉΠ» ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ΄Π°Π»Π΅Π½ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ unlink. ПослС осущСствлСния Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΎΠΉ Ρ„Π°ΠΉΠ» с извСстным ΠΈΠΌΠ΅Π½Π΅ΠΌ удаляСтся ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ unlink. Если link Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ EEXIST, ΠΏΠΎΡ‚ΠΎΠΊ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ссылку Π΅Ρ‰Π΅ Ρ€Π°Π· (Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ листингу 9.9). Одно ΠΈΠ· Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ ΠΊ этому ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ β€” Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ», ΠΈ ссылка Π½Π°Ρ…ΠΎΠ΄ΠΈΠ»ΠΈΡΡŒ Π² ΠΎΠ΄Π½ΠΎΠΉ Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмС, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ вСрсий Unix Π½Π΅ Π΄ΠΎΠΏΡƒΡΠΊΠ°ΡŽΡ‚ создания ТСстких ссылок (Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π²Ρ‹Π·ΠΎΠ²Π° link) Π² Ρ€Π°Π·Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹Ρ… систСмах.

Вторая ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ функция open Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ Π² случаС сущСствования Ρ„Π°ΠΉΠ»Π°, Ссли ΡƒΠΊΠ°Π·Π°Π½ Ρ„Π»Π°Π³ O_TRUNC ΠΈ Π·Π°ΠΏΡ€Π΅Ρ‰Π΅Π½ доступ Π½Π° запись. Для получСния Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ open, указывая Ρ„Π»Π°Π³ΠΈ O_CREAT | O_WRONLY | O_TRUNC ΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ mode со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ 0 (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π½Π° доступ ΠΊ Ρ„Π°ΠΉΠ»Ρƒ установлСны Π² 0). Если Π²Ρ‹Π·ΠΎΠ² оказываСтся ΡƒΡΠΏΠ΅ΡˆΠ½Ρ‹ΠΌ, Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° установлСна ΠΈ ΠΌΡ‹ просто удаляСм Ρ„Π°ΠΉΠ» Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ unlink послС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Ρ€Π°Π±ΠΎΡ‚Ρ‹. Если Π²Ρ‹Π·ΠΎΠ² open Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ EACESS, ΠΏΠΎΡ‚ΠΎΠΊ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π΅Ρ‰Π΅ ΠΎΠ΄Π½Ρƒ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΡƒ (Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ листингу 9.9). Π­Ρ‚ΠΎΡ‚ Ρ‚Ρ€ΡŽΠΊ Π½Π΅ срабатываСт, Ссли ΠΏΠΎΡ‚ΠΎΠΊ ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚ ΠΏΡ€Π°Π²Π°ΠΌΠΈ ΠΏΡ€ΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ.

Π£Ρ€ΠΎΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·Π²Π»Π΅Ρ‡ΡŒ ΠΈΠ· этих ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ², прост: Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΎΠΉ fcntl. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΡ‚ΠΎΠ»ΠΊΠ½ΡƒΡ‚ΡŒΡΡ с ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ старыС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ, ΠΈ особСнно часто это Π±ΡƒΠ΄Π΅Ρ‚ Π²ΡΡ‚Ρ€Π΅Ρ‡Π°Ρ‚ΡŒΡΡ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ…, написанных Π΄ΠΎ ΡˆΠΈΡ€ΠΎΠΊΠΎΠ³ΠΎ распространСния Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ с Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΎΠΉ fcntl.

9.9. Π‘Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π² NFS

АббрСвиатура NFS Ρ€Π°ΡΡˆΠΈΡ„Ρ€ΠΎΠ²Ρ‹Π²Π°Π΅Ρ‚ΡΡ ΠΊΠ°ΠΊ Network File System (сСтСвая файловая систСма); эта систСма ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ обсуТдаСтся Π² Π³Π»Π°Π²Π΅ 29 [22]. Π‘Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° записСй fcntl прСдставляСт собой Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ NFS, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΠΎΠ΅ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎΠΌ Π΅Π΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ. ΠžΠ±ΡΠ»ΡƒΠΆΠΈΠ²Π°Π΅Ρ‚ΡΡ эта Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° двумя Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ Π΄Π΅ΠΌΠΎΠ½Π°ΠΌΠΈ: lockd ΠΈ statd. ΠŸΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ fcntl для получСния Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ ядро ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Ρ„Π°ΠΉΠ» находится Π² Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмС NFS. Π’ΠΎΠ³Π΄Π° Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ Π΄Π΅ΠΌΠΎΠ½ lockd посылаСт Π΄Π΅ΠΌΠΎΠ½Ρƒ lockd сСрвСра запрос Π½Π° ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ. Π”Π΅ΠΌΠΎΠ½ statd Ρ…Ρ€Π°Π½ΠΈΡ‚ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°Ρ…, ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΠ²ΡˆΠΈΡ… Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ, ΠΈ взаимодСйствуСт с lockd для обСспСчСния снятия Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ Π² случаС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ процСссов.

Установка Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ записи Π² NFS Π΄ΠΎΠ»ΠΆΠ½Π° Π·Π°Π½ΠΈΠΌΠ°Ρ‚ΡŒ Π² срСднСм большС Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, Ρ‡Π΅ΠΌ для локального Ρ„Π°ΠΉΠ»Π°, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ для установки ΠΈ снятия Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ трСбуСтся ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΏΠΎ сСти. Для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ NFS Π½ΡƒΠΆΠ½ΠΎ всСго лишь ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ имя Ρ„Π°ΠΉΠ»Π°, опрСдСляСмоС константой SEQFILE Π² листингС 9.2. Если ΠΈΠ·ΠΌΠ΅Ρ€ΠΈΡ‚ΡŒ врСмя, Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΠΎΠ΅ для выполнСния 10000 ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ ΠΏΠΎ ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΡŽ порядкового Π½ΠΎΠΌΠ΅Ρ€Π° Π½ΠΎΠ²ΠΎΠΉ вСрсиСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΎΠ½ΠΎ окаТСтся ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Π² 80 Ρ€Π°Π· большС, Ρ‡Π΅ΠΌ для локального Ρ„Π°ΠΉΠ»Π°. Однако Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π² этом случаС происходит ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΏΠΎ сСти ΠΈ ΠΏΡ€ΠΈ опСрациях чтСния ΠΈ записи (для измСнСния порядкового Π½ΠΎΠΌΠ΅Ρ€Π°).