[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>

����������:

 

������������ ���������������� - ������� ��������� (1)

[run in paralell]

������:

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

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

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

����� ������� ��������� ���������� ������� �� ���� ����� �� ����� LinuxFocus ( ������2002 � ������2003 ).
_________________ _________________ _________________

 

����������

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

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

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

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

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

 

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

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

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

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

����� ��� ��� �� ������ ��� ������������ �������� ��������� � ����� 'C' ���������� ����������� ��� ���� ������ ������������� - ���������������� ��������.

 

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

���������� ���������� ����� ������, � ������� �������� ���������� �������������� ��������; � ������� ������� �� ����������� �������� ������ �� ����� ������� ���������� �� ������ ���������, ������� ���������� �������� �������� � ������������ � �� ��������. ������������� �������� ��������� ��������� ��� ��������� ����� ������� ���������; ����� ������, ��� ��� ������� ��������� (TCP/IP, DNS, SMTP, ...) ��������� �� ����������� ������ �����������. ��� ���������� ������ - ��� ������� ������� �� ����� �� ���������� ���������� �������������� ��������� ��� ����� �������. ��� �� ������ � ��������� �������, ������������ �������������� ������ ( ��������� ����������� �� �������������� ) - ��� ��� ����� ������.

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

������� B:


������� A:

����� �������� �������������� �� ����������� ������ ���������� ������� � ����� �������; � �������� ����� ��� ������� �� ������� ����������������� ��������� ( ������/������ ), �� ��� ���� ��������� �������.

������������� �������� ����� �������� � n ���������. ����� �������, ����� �, ������������ ���� ������ � ����� �������� ��������� �������� �. ����� ������ �������� � ��� ������������ ������, ��� ������������� ������ ��������� ���������, ����� �.

 

������� ��������� � System V

������ ���������� ���������� ����� ���������� �� Linux. ��� ���� ������� ����� ��� �������� ����� ���������� ��� ������ �� �����������, ��������������� ������ ��������� ��������� � ��� ������ ����� � ����������� ����������: � �������, ��� �������� ������ � �������� �������� ���������, ������������� ��������� ������� � IPC �������.

��������� ��� �������� ��������� ���������� msgbuf ;� ��������� � linux/msg.h

/* message buffer for msgsnd and msgrcv calls */
struct msgbuf {
        long mtype;         /* type of message */
        char mtext[1];      /* message text */
};

���� mtype ��������� ��� ��������� � ������ ����� ������������� ��������: ������������ ����� ������ ��������� � �� �������� �������������� ���������� ���������� ������� - ��� ����� ���������. ������ ���� ������������ ���� ���������. ��������� msgbuf ����� ���� �������������� � ��������� ����� ������� ������; �������� �� ����� ���������� �� ���:
struct message {
        long mtype;         /* message type */
        long sender;        /* sender id */
        long receiver;      /* receiver id */
        struct info data;   /* message content */
        ...
};

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

��� �������� ����� ������� ������� ���������� ������� msgget()

int msgget(key_t key, int msgflg)
� ������� ���������� �������� ��������� � IPC ����, ������� ����� ���������� �
IPC_CREAT | 0660
( ������� �������, ���� ��� ��� �� ���������� � ������������ ������ ��������� � ������ 'users' ). ��� ������� ���������� ������������� �������.

��� � � ���������� ��������, �� �������������, ��� ������ �� ��������, ��� ��������� ������ ���� � � ������� ������� �������� �����, �������� �� ��, ��� ����� �������� � ���������� IPC ����.

����� ������� ��������� � �������, ���� �� �������������, ���������� ������������ ������� msgsnd()

int msgsnd(int msqid, struct msgbuf *msgp, int msgsz, int msgflg)

��� msqid ������������� �������, msgp ��������� �� ���������, ������� �� ����� ������� ( ��� �������� ��������� ��� struct msgbuf �� ������� �� �������������� ), msgsz ������ ��������� ( �������� ����� mtype ���� long, �.�. 4 ����� ) � msgflg ���� ������� ��������. ������ ��������� ���������� ������ ��������, ��������� ��������� ���������:
length = sizeof(struct message) - sizeof(long);

��� �������� ������� �������� � ������ ������ �������: ���� msgflg ���������� � IPC_NOWAIT ���������� ������ ������� �� ����� ����� ������������ ������� � ������ � ����� ������: ��������� �� ��������� �� ���� �������, ����� ����� ������������� ������ ��������� ������.

����� ��������� ���������, ����������� � ������� ���������� ������������ ��������� ������� msgrcv()

int msgrcv(int msqid, struct msgbuf *msgp, int msgsz, long mtype, int msgflg)


��� msgp ��������� �� �����, � ������� �� ����� ������ ���������, � mtype ���������� ������ ������������ ��� ���������.

�������� ������� �������������� ������� ������� msgctl() � ������ IPC_RMID

msgctl(qid, IPC_RMID, 0)

������ ��������� �� ������� ��� � ��� �������� ����: �� �������� ������� ���������, ������ � ��� ��������� � ��������� ���, ����� ������� ���������������� ���������� ������ �������.
#include <stdio.h>
#include <stdlib.h>
#include <linux/ipc.h>
#include <linux/msg.h>

/* Redefines the struct msgbuf */
typedef struct mymsgbuf
{
  long mtype;
  int int_num;
  float float_num;
  char ch;
} mess_t;

int main()
{
  int qid;
  key_t msgkey;

  mess_t sent;
  mess_t received;

  int length;

  /* Initializes the seed of the pseudo-random number generator */
  srand (time (0));

  /* Length of the message */
  length = sizeof(mess_t) - sizeof(long);

  msgkey = ftok(".",'m');

  /* Creates the queue*/
  qid = msgget(msgkey, IPC_CREAT | 0660);

  printf("QID = %d\n", qid);

  /* Builds a message */
  sent.mtype = 1;
  sent.int_num = rand();
  sent.float_num = (float)(rand())/3;
  sent.ch = 'f';

  /* Sends the message */
  msgsnd(qid, &sent, length, 0);
  printf("MESSAGE SENT...\n");

  /* Receives the message */
  msgrcv(qid, &received, length, sent.mtype, 0);
  printf("MESSAGE RECEIVED...\n");

  /* Controls that received and sent messages are equal */
  printf("Integer number = %d (sent %d) -- ", received.int_num,
         sent.int_num);
  if(received.int_num == sent.int_num) printf(" OK\n");
  else printf("ERROR\n");

  printf("Float numero = %f (sent %f) -- ", received.float_num,
         sent.float_num);
  if(received.float_num == sent.float_num) printf(" OK\n");
  else printf("ERROR\n");

  printf("Char = %c (sent %c) -- ", received.ch, sent.ch);
  if(received.ch == sent.ch) printf(" OK\n");
  else printf("ERROR\n");

  /* Destroys the queue */
  msgctl(qid, IPC_RMID, 0);
}

������ ��� ���� ������ - �������� ��� �������� � �������� �� ����������������� ����� ������� ���������; ����������� ������� �� ��������� ���������� ���������: �������� ���� ���������� ������������� �������� ��������� � ������������ ( memory copy ). ��� ������, ��� ��� ���������� ������� ������� �� ����������, ����� � �������-�������� � �������-������� ����� ����� ������������� ������� � ���������� � ���.

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

#include <stdio.h>
#include <stdlib.h>
#include <linux/ipc.h>
#include <linux/msg.h>
#include <sys/types.h>

/* Redefines the message structure */
typedef struct mymsgbuf
{
  long mtype;
  int num;
} mess_t;

int main()
{
  int qid;
  key_t msgkey;
  pid_t pid;

  mess_t buf;

  int length;
  int cont;

  length = sizeof(mess_t) - sizeof(long);

  msgkey = ftok(".",'m');

  qid = msgget(msgkey, IPC_CREAT | 0660);

  if(!(pid = fork())){
    printf("SON - QID = %d\n", qid);

    srand (time (0));

    for(cont = 0; cont < 10; cont++){
      sleep (rand()%4);
      buf.mtype = 1;
      buf.num = rand()%100;
      msgsnd(qid, &buf, length, 0);
      printf("SON - MESSAGE NUMBER %d: %d\n", cont+1, buf.num);
    }

    return 0;
  }

  printf("FATHER - QID = %d\n", qid);

  for(cont = 0; cont < 10; cont++){
    sleep (rand()%4);
    msgrcv(qid, &buf, length, 1, 0);
    printf("FATHER - MESSAGE NUMBER %d: %d\n", cont+1, buf.num);
  }

  msgctl(qid, IPC_RMID, 0);

  return 0;
}

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

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

 

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

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

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

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

2003-09-25, generated by lfparser version 2.43