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

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

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

//svmsgmpxnq/server.c

1  #include "mesg.h"


2  void

3  server(int readid, int writeid)

4  {

5   FILE *fp;

6   char *ptr;

7   ssize_t n;

8   struct mymesg mesg;

9   void sig_chld(int);

10  Signal(SIGCHLD, sig_chld);

11  for (;;) {

12   /* считываниС ΠΈΠΌΠ΅Π½ΠΈ Ρ„Π°ΠΉΠ»Π° ΠΈΠ· ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ */

13   mesg.mesg_type = 1;

14   if ((n = Mesg_recv(readid, &mesg)) == 0) {

15    err_msg("pathname missing");

16    continue;

17   }

18   mesg.mesg_data[n] = 40'; /* имя Ρ„Π°ΠΉΠ»Π° */

19   if ((ptr = strchr(mesg.mesg_data, ' ')) = NULL) {

20    err_msg("bogus request: %s", mesg.mesg_data);

21    continue;

22   }

23   *ptr++ = 0; /* ptr = имя Ρ„Π°ΠΉΠ»Π° */

24   writeid = atoi(mesg.mesg_data);

25   if (Fork() == 0) { /* Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ процСсс */

26    if ((fp = fopen(ptr, "r")) == NULL) {

27     /* ошибка: Π½ΡƒΠΆΠ½ΠΎ ΡΠΎΠΎΠ±Ρ‰ΠΈΡ‚ΡŒ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ */

28     snprintf(mesg.mesg_data + n, sizeof(mesg.mesg_data) – n,

29      ": can't open, %s\n", strerror(errno));

30     mesg.mesg_len = strlen(ptr);

31     memmove(mesg.mesg_data, ptr, mesg.mesg_len);

32     Mesg_send(writeid, &mesg);

33    } else {

34     /* Ρ„Π°ΠΉΠ» ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚, ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅ΠΌ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ */

35     while (Fgets(mesg.mesg_data, MAXMESGDATA, fp) != NULL) {

36      mesg.mesg_len = strlen(mesg.mesg_data);

37      Mesg_send(writeid, &mesg);

38     }

39     Fclose(fp);

40    }

41    /* ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ° сообщСния Π½ΡƒΠ»Π΅Π²ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ‹, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰Π΅Π³ΠΎ ΠΊΠΎΠ½Π΅Ρ† Ρ„Π°ΠΉΠ»Π° */

42    mesg.mesg_len = 0;

43    Mesg_send(writeid, &mesg);

44    exit(0); /* Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ Π΄ΠΎΡ‡Π΅Ρ€Π½Π΅Π³ΠΎ процСсса */

45   }

46   /* Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ процСсс просто Π·Π°Ρ†ΠΈΠΊΠ»Π΅Π½ */

47  }

48 }

Листинг 6.20. Ѐункция-ΠΎΠ±Π΅Ρ€Ρ‚ΠΊΠ° Mesg_recv, ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‰Π°Ρ ΠΏΡ€Π΅Ρ€Π²Π°Π½Π½Ρ‹ΠΉ систСмный Π²Ρ‹Π·ΠΎΠ²

//svmsgmpxnq/mesg_recv.с

10 ssize_t

11 Mesg_recv(int id, struct mymesg *mptr)

12 {

13  ssize_t n;

14  do {

15   n = mesg_recv(id, mptr);

16  } while (n == –1 && errno == EINTR);

17  if (n == –1)

18   err_sys("mesg_recv error");

19  return(n);

20 }

6.9. ИспользованиС select ΠΈ poll с очСрСдями сообщСний

Одним ΠΈΠ· нСдостатков ΠΎΡ‡Π΅Ρ€Π΅Π΄Π΅ΠΉ сообщСний System V являСтся Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π½Π΅ дСскрипторами, Π° ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°ΠΌΠΈ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ с Π½ΠΈΠΌΠΈ нСльзя ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ select ΠΈ poll (Π³Π»Π°Π²Π° 6 [24]).

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

На самом Π΄Π΅Π»Π΅ ΠΎΠ΄Π½Π° ΠΈΠ· вСрсий Unix, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ AIX (созданная IBM), позволяСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ select с очСрСдями сообщСний System V, Π° Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с дСскрипторами. Но эта Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ имССтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² AIX.

Π­Ρ‚ΠΎΡ‚ нСдостаток часто всплываСт, ΠΊΠΎΠ³Π΄Π° Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ сСрвСр, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΠΉ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ с сСтСвыми соСдинСниями ΠΈ с IPC. Π‘Π΅Ρ‚Π΅Π²Ρ‹Π΅ соСдинСния с использованиСм интСрфСйса сокСтов ΠΈΠ»ΠΈ XTI ([24]) ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ дСскрипторы, Ρ‡Ρ‚ΠΎ позволяСт Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ select ΠΈΠ»ΠΈ poll. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹Π΅ ΠΊΠ°Π½Π°Π»Ρ‹ ΠΈ FIFO Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΡŽΡ‚ΡΡ дСскрипторами, поэтому для Π½ΠΈΡ… Ρ‚ΠΎΠΆΠ΅ допустимо использованиС этих Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ.

Одним ΠΈΠ· Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ этой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ являСтся ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅: сСрвСр Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΊΠ°Π½Π°Π» ΠΈ ΠΏΠΎΡ€ΠΎΠ΄ΠΈΡ‚ΡŒ процСсс, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ msgrcv. ΠŸΡ€ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠΈ сообщСния ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ ΠΈΠ· msgrcv, Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ процСсс ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ это сообщСниС ΠΈΠ· ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ ΠΈ Π·Π°ΠΏΠΈΡˆΠ΅Ρ‚ Π΅Π³ΠΎ Π² ΠΊΠ°Π½Π°Π». Π—Π°Ρ‚Π΅ΠΌ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ процСсс ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ select для ΠΊΠ°Π½Π°Π»Π° совмСстно с сСтСвыми соСдинСниями. НСдостаток этого ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π° Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ сообщСния ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ Ρ‚Ρ€ΠΈΠΆΠ΄Ρ‹: ΠΏΡ€ΠΈ считывании Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΌ процСссом с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ msgrcv, ΠΏΡ€ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ΅ Π² ΠΊΠ°Π½Π°Π» ΠΈ ΠΏΡ€ΠΈ считывании ΠΈΠ· ΠΊΠ°Π½Π°Π»Π° Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΌ процСссом. Для ускорСния ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΏΠΎΡ€ΠΎΠΆΠ΄Π΅Π½Π½Ρ‹ΠΉ процСсс ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ сСгмСнт совмСстно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠΉ с ΠΏΠΎΡ€ΠΎΠ΄ΠΈΠ²ΡˆΠΈΠΌ процСссом памяти, Π° ΠΊΠ°Π½Π°Π» ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ Ρ„Π»Π°Π³ (ΡƒΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 12.5).

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

Π’ листингС 5.12 ΠΌΡ‹ ΠΏΡ€ΠΈΠ²Π΅Π»ΠΈ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ с использованиСм ΠΎΡ‡Π΅Ρ€Π΅Π΄Π΅ΠΉ сообщСний Posix, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π½Π΅ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π»ΠΎ Π²Ρ‹Π·ΠΎΠ²Π° fork. Для ΠΎΡ‡Π΅Ρ€Π΅Π΄Π΅ΠΉ сообщСний Posix ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΠΎΠ±ΠΎΠΉΡ‚ΠΈΡΡŒ ΠΎΠ΄Π½ΠΈΠΌ процСссом, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ΠΈ ΠΏΡ€Π΅Π΄ΡƒΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡ‚ ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ ΠΎ появлСнии Π½ΠΎΠ²ΠΎΠ³ΠΎ сообщСния с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ сигнала. Для ΠΎΡ‡Π΅Ρ€Π΅Π΄Π΅ΠΉ System V такая Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π½Π΅ прСдусмотрСна, поэтому приходится ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°Ρ‚ΡŒ процСсс, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ msgrcv.

Π”Ρ€ΡƒΠ³ΠΈΠΌ нСдостатком ΠΎΡ‡Π΅Ρ€Π΅Π΄Π΅ΠΉ сообщСний System V ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с сСтСвым интСрфСйсом являСтся Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ считывания сообщСний ΠΈΠ· ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ памяти (Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ, прСдоставляСмая Ρ„Π»Π°Π³ΠΎΠΌ MSG_PEEK для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ recv, recvfrom, recvmsg [24, с. 356]). Если Π±Ρ‹ такая Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ имСлась, Π² ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠΉ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ схСмС ΠΊΠ»ΠΈΠ΅Π½Ρ‚-сСрвСр (для ΠΎΠ±Ρ…ΠΎΠ΄Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с select) ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ Π±ΠΎΠ»Π΅Π΅ эффСктивной, ΡƒΠΊΠ°Π·Π°Π² Ρ„Π»Π°Π³ peek ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ msgrcv Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΌ процСссом ΠΈ записав 1 Π±Π°ΠΉΡ‚ Π² ΠΊΠ°Π½Π°Π» ΠΏΡ€ΠΈ ΠΏΡ€ΠΈΡ…ΠΎΠ΄Π΅ сообщСния, Π° Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ процСсс Ρ‚ΠΎΠ³Π΄Π° просто считывал Π±Ρ‹ сообщСниС ΠΈΠ· ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ.

6.10. ΠžΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΡ, Π½Π°ΠΊΠ»Π°Π΄Ρ‹Π²Π°Π΅ΠΌΡ‹Π΅ Π½Π° ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ сообщСний

Как ΠΎΡ‚ΠΌΠ΅Ρ‡Π°Π»ΠΎΡΡŒ Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ 3.8, Π½Π° ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ сообщСний часто Π½Π°ΠΊΠ»Π°Π΄Ρ‹Π²Π°ΡŽΡ‚ΡΡ систСмныС oΠ³Ρ€aΠ½ΠΈΡ‡eния. Π’ Ρ‚Π°Π±Π». 6.2 ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Ρ‹ значСния этих oΠ³Ρ€aΠ½ΠΈΡ‡eΠ½ΠΈΠΉ для Π΄Π²ΡƒΡ… ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Ρ… Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ. ΠŸΠ΅Ρ€Π²Π°Ρ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ° прСдставляСт собой Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½ΠΎΠ΅ имя System V для ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ядра, хранящСй это ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅.


Π’Π°Π±Π»ΠΈΡ†Π° 6.2. Π₯Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€Π½Ρ‹Π΅ значСния ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ для ΠΎΡ‡Π΅Ρ€Π΅Π΄Π΅ΠΉ сообщСний

Имя ОписаниС DUnix 4.0B Solaris 2.6 msgmax МаксимальноС количСство Π±Π°ΠΉΡ‚ΠΎΠ² Π² сообщСнии 8192 2048 msgmnb МаксимальноС количСство Π±Π°ΠΉΡ‚ΠΎΠ² Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ сообщСний 16384 4096 msgmni МаксимальноС количСство ΠΎΡ‡Π΅Ρ€Π΅Π΄Π΅ΠΉ сообщСний Π² систСмС 64 50 msgtlq МаксимальноС количСство сообщСний Π² систСмС 40 40 

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

ΠŸΡ€ΠΈΠΌΠ΅Ρ€

Π’ листингС 6.21 ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ тСкст ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, которая опрСдСляСт Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ ограничСния, ΠΏΠΎΠΊΠ°Π·Π°Π½Π½Ρ‹Π΅ Π² Ρ‚Π°Π±Π». 6.2.

Листинг 6.21. ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ систСмных ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ для ΠΎΡ‡Π΅Ρ€Π΅Π΄Π΅ΠΉ сообщСний System V

//svmsg/limits.c

1  #include "unpipc.h"

2  #define MAX_DATA 64*1024

3  #define MAX_NMESG 4096

4  #define MAX_NIDS 4096

5  int max_mesg;


6  struct mymesg {

7   long type;

8   char data[MAX_DATA];

9  } mesg;


10 int

11 main(int argc, char **argv)

12 {

13  int i, j, msqid, qid[MAX_NIDS];

14  /* ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ максимального Ρ€Π°Π·ΠΌΠ΅Ρ€Π° сообщСния */

15  msqid = Msgget(IPC_PRIVATE, SVMSG_MODE | IPC_CREAT);

16  mesg.type = 1;

17  for (i = MAX_DATA; i > 0; i –= 128) {

18   if (msgsnd(msqid, &mesg, i, 0) == 0) {

19    printf("maximum amount of data per message = %d\n", i);

20    max_mesg = i;

21    break;

22   }

23   if (errno != EINVAL)

24    err_sys("msgsnd error for length %d", i);

25  }

26  if (i == 0)

27   err_quit("i == 0");

28  Msgct(lmsqid, IPC_RMID, NULL);

29  /* количСство сообщСний Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ */

30  mesg.type = 1;

31  for (i = 8; i <= max_mesg; i *= 2) {

32   msqid = Msgget(IPC_PRIVATE, SVMSG_MODE | IPC_CREAT);

33   for (j = 0; j < MAX_NMESG; j++) {

34    if (msgsnd(msqid, &mesg, i, IPC_NOWAIT) != 0) {

35     if (errno == EAGAIN)

36      break;

37     err_sys("msgsnd error, i = %d, j = %d", i, j);

38     break;

39    }

40   }

41   printf("%d %d-byte messages were placed onto queue,", j, i);

42   printf(" %d bytes total\n". i*j);

43   Msgctl(msqid, IPC_RMID, NULL);

44  }

45  /* максимальноС количСство ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ² */

46  mesg.type = 1;

47  for (i = 0; i <= MAX_NIDS; i++) {

48   if ((qid[i] = msgget(IPC_PRIVATE, SVMSG_MODE | IPC_CREAT)) == –1) {

49    printf("%d identifiers open at once\n", i);

50    break;

51   }

52  }

53  for (j = 0; j < i; j++)

54   Msgctl(qid[j], IPC_RMID, NULL);

55  exit(0);

56 }

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ максимального Ρ€Π°Π·ΠΌΠ΅Ρ€Π° сообщСния

14-28 Для опрСдСлСния максимально Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠ³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° сообщСния ΠΌΡ‹ пытаСмся ΠΏΠΎΡΠ»Π°Ρ‚ΡŒ сообщСниС, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π±ΡƒΠ΄Π΅Ρ‚ 65 536 Π±Π°ΠΉΡ‚ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΈ Ссли эта ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° оказываСтся Π½Π΅ΡƒΠ΄Π°Ρ‡Π½ΠΎΠΉ, ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅ΠΌ этот объСм Π΄ΠΎ 65 408, ΠΈ Ρ‚.Π΄., ΠΏΠΎΠΊΠ° Π²Ρ‹Π·ΠΎΠ² msgsnd Π½Π΅ окаТСтся ΡƒΡΠΏΠ΅ΡˆΠ½Ρ‹ΠΌ.