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

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

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

�� ������:

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



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

����������:

 

������������ ���������������� - ������� ��������� (3)

[run in paralell]

������:

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

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


_________________ _________________ _________________

 

���������� ��������� - ������� 2 - ����� �������

���������� ipcdemo ���� ����������� ��� ������� ���������� �����������, ������������ ������������� ������������ �����������. ����� ������� ������������� ���������� � ������� ��� ���������� "������" - ���������, ������ �������� ���� ������������� ����������� �������� ����������� � ����� ������� - ������ �� ��� ��������� ���������, ����� ������� ��������� �� �� ( ������ id ������� IPC ) ��� ��� ���������� �����������. ����� ���� ��������� ��� ��� �������: Termination � Timing: ������ ������������ ��� ��������� ������������, ��� ���������� �����������, ������ - ��� ��������� ������� ������� ������������. ���� �� ���������� ��� ������� ���������, � �������� � "������������" � "�����������" ��������������.

�� ������ ���������� ��������� ����������� ������� �������� ������ ��� �������� � ��������� ���������, ��� �������������� � "���������", ��� �������������: ��� ������� ����������� �� ������ ������� ������� ������ ���������, ��� ������ �� ���������� ���������. �������� �������� �� ��������� ���������� ����� ��������� � �������� � ����� 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;
  }
}
 

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

������ ������������� �������� �� ����� ��������� �� ��� ����� - "��" � "�����" �������� ����������� ���������. � ������ ����� ���������� ���������������� ������ ��� �������� ��������������� ����������� �������� � ������� ���� �������. ��������� ������ ��� �������� ��������������� �� ������ ������ ������� ��� ��������� ���������� - ������� ���������� ������������ ������������ ��������� � ��������� ������ ( memory allocation ), �� ���������� ���� ��� ��������� �� ��������� ������ �������. ������� �������������� ������� ���������������� ��������������� �����������, ����� �������� ��� "������������" ��� �� ���������, ����� ���������� "������������" �������������� ����� ������������� ������������ ��������.

�� ������ ����� ����� ������ ������������ ������� ����� ��� � "����������������" ����� �� ����� �� ��� ��� ���� �� ���������� ��� "������������". ���������� ��������� ��������� �� "�������������" � �������������� �� �� ����������.

/* ��������� ������� ����������� "������������" */
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 � ��� ������� ����� ������� ��� ������ �����. ������� ��� ������� ��������� ���� ����������, ��� � ��� ������� - ������� ����� ���������� ��������� �������, �� � ������ ������� �� ������ ����� ������ ����������� ���������� ( �� ��������� ��� gdb ��� ������ ���� � �������� ���������������� ), �������� �������� �� ������ ���� - ��� �� ������� ���������� ����������.

��������� ����� ���������� 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 �����.

 

����������

����� �������� �� �������� ���� �������, ���������������� �� ������������ ������� � �����... ��� ������ ��� ����� ������������ �� ������ ������� � ������� ����������� ��� ��������� �������: ��� �� �������� ������� � threads?  

������������� ����������, ����� � ����������

���������� ������� ���������� ��� � ���������� ��������, ����� ���� ������������ ��� ��������� ������� � �������� � ����������������, ������� � �.�.

��������� ������ ������ ������������, �� ������� ���� � ������ ����������: ��������� ������� ������������ gdb, � ����� ��� ddd ������, ��� ����������� ���������� ��� ������� ������, �� ���������� ����� � ������.

��������� �� �����-������ �������� ����� ��������� - "Segmentation fault" � ���������� ��� �� ��������� ������ � ����. ���� ������������ ��� ����� �������� ����� � ������, �������� �������� �� valgrind � ��������� �� �������. ����� ��� ������ core dumped ����� � ������� gdb �� ������ ������������ valgrind.

�������-�� ��������� IPC ���������� �� ����� 'C' ������� ����������, �� ���������. ��������� �������� ����� ����� ����� ����� Python: � ��� ��������� �������������� fork � ������, ��������� � ����. �������� �������� �� ���� ����.

 

���������

 

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

� ������ ������� ���� �������� �������. �� ���� �������� �� ������ �������� ���� ����������� ��� ����������� ����������� ������ ���������
 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(at)linuxfocus.org>

2004-01-27, generated by lfparser version 2.43