[LinuxFocus-icon]
<--  | �����  | �����  | ������  | �����

������� | ������ | ������ | ��� LF
��� �������� �������� �� ��������� ������: English  Castellano  Deutsch  Francais  Nederlands  Russian  Turkce  

[Leonardo]
����� Leonardo Giordani
<leo.giordani(at)libero.it>

�� ������:

������� � ������� ������ ���������� �������������������� ���������� ���������������� ������������ ������. ����������� ����������������� ( � �������� �� ���������� � C/C++ ). � 1999 ����������� ��������� ������� � Linux/Unix



������� �� �������:
Kirill Pukhlyakov <kirill(at)linuxfocus.org>

����������:

 

������������ ���������������� - ������� ��������� (2)

[run in paralell]

������:

���� ���� ����� ������� - ���������� �������� � ����� ��������������� � �� ���������� � �� Linux. ����� ��� ����� � ������������� ����� ��������������� - �� �������� ���������� ����������, ���������������� �������������� ����� ���������� ����������� ��������, �� ������������ ���������.

� ��� ������ ���� ������� �������� ��� ��������� �������:

  • ����������� ������ shell'�
  • ������ ����� 'C' (���������, �����, ����������)

������� ���� �� ����� ��� ��������� ������� ���������� ������� �� ���� �����:

 

��������

� ������� ������� �� ���� ����� �� ��������� �������������� ������ ���� ( ��� ����� ��������� ), ��������� ������� ���������. � ���� ������� �� ������ ��������� ������� �������� ��� ������ �����������.

��� �� ��� �������, �������� - ��� ����� ������, ����������� �������� ����� ��� �������, ���� ���� ��� ������. ��������, ���������� ���� �������� ����������, ����������� ��� ���������� ������ ���� ��������� ��������� ( �� ������ ����� ��������� ��, ��� � ���� ). ������ � ���-������ ����� ������������ � �� Linux, �� ����� ��������� � �������������� ���� ( �� ���������, ��� �� ��� ������ ), � ��������� � ������� �������, ��� �� ������ ������� ���� � ������������� ��������� ������ ������� ����������, ����� ��� TCP/IP.

����� ��������� �������� ��-������ ���������� �������� � ���� ����������, ��� �������� �� ����� ������. �� �������� ��������� �������� ����������� �����������. �������� ��������� ����� ����������, � ��������� - ������������: ������ ����� - ��������� ������������� ������������ ����������� ����� ���� ����������.

� ��������� ���������� ������������� ��� �������: ��������� ������������ ( �.�. ������������ ������������ � ��������� ), ������� �������� ������������ � ��� ������������ ( ������������ �� ��������� ). ����������� ������� ��������� �� ���� ��������:

��� ����������� ������������ � ������� �� ������� ���� ����������� ������� ( �� ���������, ��� �� ������� � ��������� ), �� ������������� ������ ���� ������ �����������, ����� �� ���� ��� ���������� � ����� ������������. ����� ����� ����� ������� ����� ��������� ������, ���� � ��� ���� �������������. �� ����������� ���������� �������� ������������� �������, ����� ����� ���� �������� ��������� ������ �������������.

������������ ����� �������� � ��������� ���������. � ������ ������� ��������� ������� ������������ �� ������ ������� ������ - ��������� �� ��� ���, �� � ����� ������ ����������� ������������ ���������� ������� �����, ����� �� ���� ��� ��������� � ��� ����������. ����������� ������� ������ �� ���� ������ - ��� ������� ����������.

��� ���������� ������������ �� ������� ��� ���������� ���������� �� ���� ����������. � ���� ��������� ���� ������������ ��� ��� �������

/* Birth */
create_queue
init
send_alive
send_queue_id
get_switch_queue_id

/* Work */
while(!leaving){
 receive_all
 if(<send condition>){
  send_message
 }
 if(<leave condition>){
  leaving = 1
 }
}

/* Death */
send_dead

������ ���������� ��������� ������ �����������: ��� ����������� ������������ �� �������� ��������� � ��������������� ��� ������� ���������; ��� ���������� ��� ���������, ����� ���������� ��������������� ��� ��������� � � ���� ������� �������� ��� ������������� ������� ���� �� �� ��� �������� ��������� ��� ������ �������������. �����, ��� ���������� ������������� ��������� �� ������������� � ��������� ���������� ��� ��� ��, ���� ��� �������������: � ������ ���� ������������ ��������� - �������� ��� ���������, ���� ��� - �������� ���������, � ����� ������� ���������� ���� ����� �����������. ��� ���������� ������������ �� ������� ������������� ��� ������� � �� ���������� �����������.

��� ����������� ��������� �������

while(1){
 /* New user */
 if (<birth of a user>){
  get_queue_id
  send switch_queue_id
 }

 /* User dies */
 if (<death of a user>){
  remove_user
 }

 /* Messages delivering */
 check_message
 if (<user alive>){
  send_message
  ack_sender_ok
 }
 else{
  ack_sender_error
 }
}
 

��������� ������

��������� ������ ���� �� ��������� � ������� �������� � �������. ����� ����, ������� ���������� ��������� ������ �������� �� 50% ������������ ����. � �� ���� ������������ � ������ ������� ����� ������� ��������� ������� ��������� ��������� ������, ������, ��� ���� ������ ���������� �������, �� � ���������� ������� � ���� ������� ���� ���� ��������. ������� ����������� � ��� ���� ����� �������� ������������ glibc ( www.gnu.org ), �� ���� �� ����� �������������� � ������ ��������� �������.  

���������� ��������� - ������� 1

��� �������� ����� ��� ������, ������ ( ������ ) ������� �� ������� ��� ���������� ���������, �������� � ������� ���������, ������� ������� ����������� ��������� ������� � �����, ������� �� ��������������� ��������� ����������� � �������������.

������ ��� ��� ���������� - ���������� ��������� ��� ���������, ��������� �������� ������ ���� - msgbuf

typedef struct
{
  int service;
  int sender;
  int receiver;
  int data;
} messg_t;

typedef struct
{
  long mtype; /* Tipo del messaggio */
  messg_t messaggio;
} mymsgbuf_t;

��� �� ����� ���� ����� ���, ������� �� �������� �����: ���� ���������� � ����������� �������� ������������� ������������, ���� ������ - ����� ������, ���� ������� ������������ ��� ������� �� ������������ � �����������. �������� ����������, ��� � ��� ��� ������� - ���� ��� ���������������� � ���� ��� ����������� �������� - � ������ ������ ���� ������ �������� ���������� ������ ��������. ��� ����� ���� ������, �� ��� ����� ������ ��������� ������������ ���������� ���� �������.

������ ������� ��������� ������� ��� ���������� ������ ����������� ������, � ��������� ��� ���������� � ������ ����� ���������. ��� ������� �����-����� �����, ������� � ������ ������ ��� �� ���, � ��������� �� ������� � ������������ ������

.
void set_sender(mymsgbuf_t * buf, int sender)
{
  buf->message.sender = sender;
}

int get_sender(mymsgbuf_t * buf)
{
  return(buf->message.sender);
}

���������� �� �� � ���������� ���� ( ������ ������� ����� �� ����� ������ ), � � ����������� ��������� � ����-�� ����� ��������� ��� ��������, � ������������� ��� ��������� ��������� � �����.

������ ������� ������� ��� �������� IPC ������, �������� � �������� �������� ���������, �������� � ��������� ���������: �������� IPC �����

key_t build_key(char c)
{
  key_t key;
  key = ftok(".", c);
  return(key);
}

������� �������� �������

int create_queue(key_t key)
{
  int qid;

  if((qid = msgget(key, IPC_CREAT | 0660)) == -1){
    perror("msgget");
    exit(1);
  }

  return(qid);
}

��� ������ ��������� ������ � ������ ������ ���������� ������. ��������� ������� - ����������� �������

int remove_queue(int qid)
{
  if(msgctl(qid, IPC_RMID, 0) == -1)
  {
    perror("msgctl");
    exit(1);
  }
  return(0);
}

� ������� ������� ��� �������� � ��������� ��������� - �.�. ������ ��������� � ������������ ������� � ������ �� ���

int send_message(int qid, mymsgbuf_t *qbuf)
{
  int result, lenght;
  lenght = sizeof(mymsgbuf_t) - sizeof(long);
  if ((result = msgsnd(qid, qbuf, lenght, 0)) == -1){
    perror("msgsnd");
    exit(1);
  }

  return(result);
}

int receive_message(int qid, long type, mymsgbuf_t *qbuf)
{
  int result, length;
  length = sizeof(mymsgbuf_t) - sizeof(long);

  if((result = msgrcv(qid, (struct msgbuf *)qbuf, length, type, IPC_NOWAIT)) == -1){
    if(errno == ENOMSG){
      return(0);
    }
    else{
      perror("msgrcv");
      exit(1);
    }
  }

  return(result);
}

��� � ���. �� ������ ����� ��� ������� � ����� layer1.h: ���������� �������� ���� ��������� ��������� ��. � ��������� ������� �� ��������� � ������ ������ ��������� � �������� ���.

 

������������� ����������

 

�������� �������

� ������ ������� ���� �������� �������. �� ���� �������� �� ������ �������� ���� ����������� ��� ����������� ����������� ������ ���������
 talkback page 

<--, ������� � ��������� �������� �������

Webpages maintained by the LinuxFocus Editor team
© Leonardo Giordani, FDL
LinuxFocus.org
Translation information:
en --> -- : Leonardo Giordani <leo.giordani(at)libero.it>
en --> ru: Kirill Pukhlyakov <kirill(at)linuxfocus.org>

2003-09-26, generated by lfparser version 2.43