|
|
��� �������� �������� �� ��������� ������: 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> ����������:
|
������������ ���������������� - ������� ��������� (1)������: ���� ���� ����� ������� - ���������� �������� � ����� ��������������� � �� ���������� � �� Linux. ����� ��� ����� � ������������� ����� ��������������� - �� �������� ���������� ����������, ���������������� �������������� ����� ���������� ����������� ��������, �� ������������ ���������. � ��� ������ ���� ������� �������� ��� ��������� �������:
����� ������� ��������� ���������� ������� �� ���� ����� �� ����� LinuxFocus ( ������2002 � ������2003 ). |
������ ������������� - ��������� ��������� ������� �� ������, �� �� ����������� ������� �������� ( ����� ����������� ������ ����� ������ ������ ), � �������������, ����� �� ����� �������� ����� ��� ������-���� �������� � ������ �������, � ��� ������� - �� ������ � �.�.
������������� ��������� ��� ����� ���������� ������� � � ���� �� ������������ ������� - ������� ������, ��� ������ ������� ������ ��������� ��������� ��� �������, � ������� ���������� ������������������, � ������������, ������, ��� ��� �� ��������� ��� ������������ ����� ����������� ����� ����������. ����������� �������� �������� ������ �������� - ������� �������� ��� ������ ���� ������� ������� �������������� �������� - �������� �� ��������� ������� �����.
����� ����, ������������ �������� ������� � ����������� �������� ����������� ��������� ����� �������� � ���������� ���������� ��������, ����� ������ ������� ��������� � ����� ����������� ������ �� ���� ��� �����-� ������ ������� ������� �������� ��� ���. ��� �� ��� ������, � ���� ������������� ���������������� ���������� ������ ������� ����� � ����� ������� ����� �������.
��� �������� ����������� ��������� ��� ������, ��� �������� - ������������ ���������� ��� ������� ������� ������� �������������. ���������� ������� - ������������� �������� ��������� - � ���� ������� �� ���������� ������ �������������� ��������� � ������� ��������� ���������, ��������� �������� SysV.
������������� ������� ����� ������ ���������� �� � ���� �������� ������� ����� ����������: ������ ������� �������� ������� ��� �������������� � ������� ����������. ������� ������ ���������, ��������������� ��� � ���������� ��� ������ ������� �� ���� ���������.
����, ������������� ���� ��������� ����������� �������������� ���������: ������� ��-�������� ����� �������� ����������, ����� �������� ����� �� ������, � ���������� ������� ������ ���������� ��� ������ ���������. ������ �� ���������, ��� ������������� ��������� �� ����� ������� ��������� ��� ��� ����� ���������� �������.
����� ��� ��� �� ������ ��� ������������ �������� ��������� � ����� 'C' ���������� ����������� ��� ���� ������ ������������� - ���������������� ��������.
���������� ������� ��������, ���������� �� ������ �����������: ��� �������� ( � � � ) ����������� ����������� � �������� � ������� �������: ����� ��������� ������ ������� �� ���������� ���������� �������. ������� �������� �� �������������� �������� ��������� �������:
������� B:
������������� �������� ����� �������� � n ���������. ����� �������, ����� �, ������������ ���� ������ � ����� �������� ��������� �������� �. ����� ������ �������� � ��� ������������ ������, ��� ������������� ������ ��������� ���������, ����� �.
��������� ��� �������� ��������� ���������� msgbuf ;� ��������� � linux/msg.h
/* message buffer for msgsnd and msgrcv calls */ struct msgbuf { long mtype; /* type of message */ char mtext[1]; /* message text */ };
struct message { long mtype; /* message type */ long sender; /* sender id */ long receiver; /* receiver id */ struct info data; /* message content */ ... };
��� �������� ����� ������� ������� ���������� ������� 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)
length = sizeof(struct message) - sizeof(long);
����� ��������� ���������, ����������� � ������� ����������
������������ ��������� �������
msgrcv()
int msgrcv(int msqid, struct msgbuf *msgp, int msgsz, long mtype, int msgflg)
�������� ������� �������������� ������� �������
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); }
��� ���������� � ���� ��������� ���������: ����������� �������
������������ ������� ���������� ������ �������� ������� -
����������� ������� ���������� ��������� ����� � ���������� ��
�������� �������� � ��� ��� ������� �� � ����������� ����� ������.
#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; }
|
Webpages maintained by the LinuxFocus Editor team
© Leonardo Giordani, FDL LinuxFocus.org |
Translation information:
|
2003-09-25, generated by lfparser version 2.43