|
|
��� �������� �������� �� ��������� ������: English Castellano Deutsch Francais Nederlands Russian Turkce |
����� Leonardo Giordani <leo.giordani(at)libero.it> �� ������: ������� � ������� ������ ���������� �������������������� ���������� ���������������� ������������ ������. ����������� ����������������� ( � �������� �� ���������� � C/C++ ). � 1999 ����������� ��������� ������� � Linux/Unix ������� �� �������: Kirill Pukhlyakov <kirill(at)linuxfocus.org> ����������: |
������������ ���������������� - ������� ��������� (2)������: ���� ���� ����� ������� - ���������� �������� � ����� ��������������� � �� ���������� � �� Linux. ����� ��� ����� � ������������� ����� ��������������� - �� �������� ���������� ����������, ���������������� �������������� ����� ���������� ����������� ��������, �� ������������ ���������. � ��� ������ ���� ������� �������� ��� ��������� �������:
������� ���� �� ����� ��� ��������� ������� ���������� ������� �� ���� �����:
|
��� �� ��� �������, �������� - ��� ����� ������, ����������� �������� ����� ��� �������, ���� ���� ��� ������. ��������, ���������� ���� �������� ����������, ����������� ��� ���������� ������ ���� ��������� ��������� ( �� ������ ����� ��������� ��, ��� � ���� ). ������ � ���-������ ����� ������������ � �� 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 } }
������ ��� ��� ���������� - ���������� ��������� ��� ���������, ��������� �������� ������ ���� - 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: ���������� �������� ���� ��������� ��������� ��. � ��������� ������� �� ��������� � ������ ������ ��������� � �������� ���.
���������� ���� �����������, ������� �� ��� �������� ����� leo.giordani(at)libero.it ��� ������ ��� ����� "�������� �������". �� ������ ������ ��� �� ����������, �������� ��� ����������� ������.
|
Webpages maintained by the LinuxFocus Editor team
© Leonardo Giordani, FDL LinuxFocus.org |
Translation information:
|
2003-09-26, generated by lfparser version 2.43