|
|
��� �������� �������� �� ��������� ������: English Castellano Deutsch Francais Russian Turkce |
����� Leonardo Giordani <leo.giordani(at)libero.it> �� ������: ������� � ������� ������ ���������� �������������������� ���������� ���������������� ������������ ������. ����������� ����������������� ( � �������� �� ���������� � C/C++ ). � 1999 ����������� ��������� ������� � Linux/Unix ������� �� �������: �������� ������ <kirill(at)linuxfocus.org> ����������:
|
������������ ���������������� - ������� ��������� (3)������: ��� ��������� ������� �� ����� � ������������ ����������������: � ��� �� ���������� ������ ������� ������ ���������, �������� �������, ����������� ��������� ������������ �� ������ ������� ������ ������ ���������, �������������� � ������� �������. ������� ���� �� ����� ��� ��������� ������� ���������� ������� �� ���� �����:
|
�� ������ ���������� ��������� ����������� ������� �������� ������ ��� �������� � ��������� ���������, ��� �������������� � "���������", ��� �������������: ��� ������� ����������� �� ������ ������� ������� ������ ���������, ��� ������ �� ���������� ���������. �������� �������� �� ��������� ���������� ����� ��������� � �������� � ����� layer2.h.
���������� ipcdemo ����������������, ������������������ - �� ������ �������� ����� ���������� ����������, ���� �������� ���� �������� �� ��, ��� ������� ������� �������� ���������� �������� �������� IPC, �� �� ����������� ����. ��� �� �����, ���� �� ���������� ���-�� ������������� �������� - ������ ��� � �� �������.
��� ������������� "�����������������" �������� ������ ��� ��� ���������� ������� - ��� ������� ������� � �������� ����������� ��� ���������� � ���: ����� ������� ��� ���� ������� ��� ��������� - SERV_BIRTH � SERV_QID.
/* ������������� ������� */ qid = init_queue(i); /* ��������� ����������� � ������������� "������������" */ child_send_birth(i, sw); /* ��������� ����������� ������� ��������� � "������������" */ child_send_qid(i, qid, sw);����� ���������� �������� ������: ������� ���������, ��������� ������� ��������� �� ������ "�������������", ��������� ������� ������� ����������� � ������� �� �����.
������� � ������� ��������� ����������� �� ������������� ������: ������� myrand() ���������� ��������� ����� � �������� �� 0 �� �������� ����������� ���������, � ����� ������ 100, �� �������� ��������� ������ ���� ��� ����� ������ ��������� �����������. ��� ��� "������������" "����" 1 ������� ����� ����������������� ������������ ���� �����, ��, ������, �� ������ 100 ������ �� ����� �������� ��������� �������� ������� ���, ���� ����� �������� ����������� �������; ��� �� ������������, ��� ������� �� 100 ��������� ����������, ����� ���������� ����������� � ����������������, �� ����� ���� 100 ��������� ���������� ���� ��� �����... ������ ������ ��������, ��� � ��������� �� ���� ��������� ������� ��������� �����������, ����� ���� ��������� ����� ������� ������.
if(myrand(100) < send_prob){ dest = 0; /* �� �������� ��������� �����������, ������ ���� � */ /* ��� ����������� */ while((dest == 0) || (dest == i) || (dest == olddest)){ dest = myrand(childs + 1); } olddest = dest; printf("%d -- U %d -- Message to user %d\n", (int) time(NULL), i, dest); child_send_msg(i, dest, 0, sw); }��������� ���������� �������������� ����������� � ����� ������������ ������������ ��� - �� ������� ��� TYPE_CONN (�� CONNECTION).
/* ��������� ������� ������� �������� ��������� */ if(child_get_msg(TYPE_CONN, &in)){ msg_sender = get_sender(&in); msg_data = get_data(&in); printf("%d -- U %d -- Message from user %d: %d\n", (int) time(NULL), i, msg_sender, msg_data); }��� ������� ������� ����������� ����� ������������ ��������� ���� TYPE_SERV. � ������ ��������� ��������� � ����������� ������ - "������������" ���������� ��������� �������������� ���������, ����� ���������� ������� "������������" ��� ������������ � ��������� �������� ��� ���������; ����� " ������������" ������ ��������� ��� ���������, ��������������� ��� ( ����� ��������� ��������, �� ����� ���������� ���� ������ ), ������� ������� � ������� "�� ��������" �����������. � ������ ������� ������� �������� ������� �� �������� ����������� ��������� � ������� ��������, ������� ��� ���������� ��������� ������� ����� �������� ��������� � ����������� ���������, ����� ����� ������� ������� ��������� ������� � �������� � ������� ��� �������� � ���.
/* �������� ������� ������� ����������� */ if(child_get_msg(TYPE_SERV, &in)){ msg_service = get_service(&in); switch(msg_service){ case SERV_TERM: /* ��������, ���������� ���������� ������ */ /* ������� ������������� ����������� */ child_send_death(i, getpid(), sw); /* ��������� ��������� �� ������� */ while(child_get_msg(TYPE_CONN, &in)){ msg_sender = get_sender(&in); msg_data = get_data(&in); printf("%d -- U %d -- Message from user %d: %d\n", (int) time(NULL), i, msg_sender, msg_data); } /* ������� ������� */ close_queue(qid); printf("%d -- U %d -- Termination\n", (int) time(NULL), i); exit(0); break; case SERV_TIME: /* ���������� �������� ����� ������� ���������� ��������� � �������� */ child_send_time(i, sw); printf("%d -- U %d -- Timing\n", (int) time(NULL), i); break; } }
�� ������ ����� ����� ������ ������������ ������� ����� ��� � "����������������" ����� �� ����� �� ��� ��� ���� �� ���������� ��� "������������". ���������� ��������� ��������� �� "�������������" � �������������� �� �� ����������.
/* ��������� ������� ����������� "������������" */ if(switch_get_msg(TYPE_CONN, &in)){ msg_receiver = get_receiver(&in); msg_sender = get_sender(&in); msg_data = get_data(&in); /* ���� ������� �������� */ if(queues[msg_receiver] != sw){ /* ������� ��������� �������� */ switch_send_msg(msg_sender, msg_data, queues[msg_receiver]); printf("%d -- S -- Sender: %d -- Destination: %d\n", (int) time(NULL), msg_sender, msg_receiver); } else{ /* ������� ���������� */ printf("%d -- S -- Unreachable destination (Sender: %d - Destination: %d)\n", (int) time(NULL), msg_sender, msg_receiver); }���� "������������" �������� ��������� ����� ����������, ��� ����� ���� ������ ������ ������ �� ���� �����. ������� � ������� ������� � ����� ���� ������� ������������ �� ������������� ������ (������� ���������� ����� ���������). ������ ��� �������, ������� ����� ���� ������ - ������ �� ���������� ������ "������������", ������ - ������ �� ����� �������: �� ��������� ������� ����� � �������� ������������, ����� � ����������� �� �������� ������ �������� ����� � ������������, ������� ��� ��� ������. ���� �� �� ������� ���������, �������� ��� ������������ ��� ��������� ������. � ���� ������ �� ��������, ����� ����������� �������� ��������� ������ �� ����� (��������� ������������ ����� ��������� ���������� ��������� � �������), ���������� ���� ������� � �������.
/* ��������� ������ ������� ���������� ���������� ��������� */ if((myrand(100) < death_prob) && (queues[msg_sender] != sw)){ switch(myrand(2)) { case 0: /* ������������ ������ ����������� */ printf("%d -- S -- User %d chosen for termination\n", (int) time(NULL), msg_sender); switch_send_term(i, queues[msg_sender]); break; case 1: /* �������� ������� ������ ������������ */ if(!timing[msg_sender][0]){ timing[msg_sender][0] = 1; timing[msg_sender][1] = (int) time(NULL); printf("%d -- S -- User %d chosen for timing...\n", timing[msg_sender][1], msg_sender); switch_send_time(queues[msg_sender]); } break; } } } else{ if(deadproc == childs){ /* ��� ����������� �������� ��������� ������, �������� ��������� ��������� ����� ����� */ waitpid(pid, &status, 0); /* �������� ������� ����������� */ remove_queue(sw); /* ���������� ��������� */ exit(0); } }����� �� ���������, �� �������� �� �� ��������� ���������: �� ����� �������� ��������� � ������ � ���������� ������ ������������, id ������� � ������ �� ������ ������ �������.
if(switch_get_msg(TYPE_SERV, &in)){ msg_service = get_service(&in); msg_sender = get_sender(&in); switch(msg_service) { case SERV_BIRTH: /* ����������� ������ ������������ */ printf("%d -- S -- Activation of user %d\n", (int) time(NULL), msg_sender); break; case SERV_DEATH: /* ���������� ������ ������������ */ printf("%d -- S -- User %d is terminating\n", (int) time(NULL), msg_sender); /* �������� ������� ������������ �� ������ */ queues[msg_sender] = sw; /* �������� ���������� �������������, ����������� ������ */ deadproc++; break; case SERV_QID: /* ������� ������������� �������������� ����� ������� */ msg_data = get_data(&in); printf("%d -- S -- Got queue id of user %d: %d\n", (int) time(NULL), msg_sender, msg_data); queues[msg_sender] = msg_data; break; case SERV_TIME: msg_data = get_data(&in); /* ���������� � ������� */ timing[msg_sender][1] = msg_data - timing[msg_sender][1]; printf("%d -- S -- Timing of user %d: %d seconds\n", (int) time(NULL), msg_sender, timing[msg_sender][1]); /* The user is no more under time control */ timing[msg_sender][0] = 0; break; } }
��������� ����� ���������� IPC �������������. �����������, ��� �� ��������� ��������� ��� ���������, ������� �������� �� ��� ��� �� ������, � ���� ������ ������� ������� ������ Ctrl-C �� ��������� ��� ����������� ��������. ����� � �� �������� �� ������� "kill", �� ������ �� ������ ������� � ��������� � � ������, ��� �� ����������� � man ���������. �� ���� ��� ���� ����, ������� ��������� �� ����� �������� - IPC ���������. � ����������� ���� ������� ������������ �������� �� ��������� ���������� ������; ����� ������� ��� - �� ����� ������������ ��������� ipcs � ipcrm: ipcs ���������� ������ ���������� IPC �������� (������ ����������� - ��� ������� ��� ��� �������, �� ������ ������ ����������), � ipcrm ���� ��� ����������� ������� ��������� �� ���; ���� �� ��������� ipcrm ��� ���������� - �� �������� ��� ������������ ��� ����������: ������������ ����� ��� ������ ������������� - "5 70 70".
�������������� �������� "tar xvzf ipcdemo-0.1.tar.gz". ����� ������� ipcdemo ��������� ������� "make" ������ �������� � ��������; "make clean" - ������� backup �����, � "make cleanall" ������� ����� object �����.
��������� ������ ������ ������������, �� ������� ���� � ������ ����������: ��������� ������� ������������ gdb, � ����� ��� ddd ������, ��� ����������� ���������� ��� ������� ������, �� ���������� ����� � ������.
��������� �� �����-������ �������� ����� ��������� - "Segmentation fault" � ���������� ��� �� ��������� ������ � ����. ���� ������������ ��� ����� �������� ����� � ������, �������� �������� �� valgrind � ��������� �� �������. ����� ��� ������ core dumped ����� � ������� gdb �� ������ ������������ valgrind.
�������-�� ��������� IPC ���������� �� ����� 'C' ������� ����������, �� ���������. ��������� �������� ����� ����� ����� ����� Python: � ��� ��������� �������������� fork � ������, ��������� � ����. �������� �������� �� ���� ����.
|
Webpages maintained by the LinuxFocus Editor team
© Leonardo Giordani, FDL LinuxFocus.org |
Translation information:
|
2004-01-27, generated by lfparser version 2.43