Оқулық «Федералдық білім беруді дамыту институты»



Pdf көрінісі
бет184/220
Дата25.02.2022
өлшемі2,22 Mb.
#26438
түріОқулық
1   ...   180   181   182   183   184   185   186   187   ...   220
~k
 
/
 
/
 
шығармайды. 
 
Кезекті  басқару  үшін  және  оның  параметрлерін  қабылдау  үшін 
msgctl() функциясы қызмет етеді:
 
int msgctl(int msgfd, int cmd, struct msqid_ds 
*mbufPtr);
 
Мsgfd  параметрі  ретінде,  оған  кезектің    дескрипторы  беріледі; 
mbufPtr  параметрі  кезекті  басқару  параметрін  береді;  параметр  cmd, 
кезекте  орындалатын  команданы  береді;  Параметр  келесі  мәндерді 
қабылдай алады: 
 
■ 
IPC_STAT  —  кезектің  басқаратын  параметрлерін  құрылымға 
көшіру, көрсеткіш mbufPtr параметрімен беріледі;
 
■ 
IPC_SET 
—  құрылымда  болатын  параметрлерді  кезекпен 
алмастыру,  көрсеткіші  mbufPtr  параметрімен  беріледі  бұл 
операцияны сәтті  орындау  үшін  пайдаланушы  –  root  пайдаланушы 
болуы керек, немесе құрушы, немесе кезектің иесі тағайындауымен 
болуы мүмкін;
 
■ 
IPC_RMID — кезекті жүйеден өшіру. Бұл операцияны сәтті орындау 
үшін    пайдаланушы  –  root  пайдаланушы  болуы  керек,  немесе 
құрушы,  немесе  кезектің  иесі  тағайындауымен  болуы  мүмкін.  Бұл 
жағдайда, mbufPtr параметрі ретінде  NULL беріледі.
 
■ 
 
Мsq
id_ds 
құрылы
мы 
хабарла
ма 
кезегіні
ң  келесі 
парамет
рлерін 
береді:  
 
struct
 
struct
 
struct
 
struct
 
time_t
 


 
218 
 
time_t
 
time_t
 
ushort
 
ushort
 
ushort
 
ushort
 
ushort
 
 


219 
 
 
Келесі  бағдарлама  екі  процесс  аралығындағы  хабарламалардың 
көмегімен  ақпарат  алмасуды  безендіреді.  Бағдарлама  екі  процесті 
туындатады — аталық процесс және топ-процесс. Аталық топқа латын 
әріптері  түріндегі  хабарлама  жібереді,  әр  хабарламаның  типі  —  әріп 
нөмірі.  Топтары  бұл  хабарламаларды  кері  ретпен  қабылдайды. 
Қолданылатын кезектің  идентификаторы PID  аталық-процесіне  сәйкес 
келеді:
 
#include 
 
#include 
 
#include 
 
#include 
 
#include 
 
#include 
 
#include 
 
struct message  
{
 
long type;  
char text[10];
 
};
 
int main()
 
{
 
pid_t pid;  
int qId;  
char i;  
int *status;
 
struct message my_message; 
setvbuf(stdout,(char*)NULL,_IONBF,0);
 
switch (pid = fork() )
 
{
 
case -1:
 
perror("Bad fork\n");
 
_exit(1);  
break;  
case 0:
 
/* топ денесі */
 
/* аталықтың кезекті толтырғанын күтеміз */ 
sleep(10);
 
/* құрылған кезектерді ашу */  
qId = msgget(getppid(), 0 ) ;
 


 
220 
 
if (qld == -1)
 
{
 
printf("Unable to open queue\n");
 
_exit(0);
 
}
 
printf("r> "); for (i=26;i>0;i--)
 
{
 
/* кері ретпен хабарламаны қабылдау */ 
msgrcv(qId,&my_message, 2, i, MSG_NOERROR); 
printf ("%d:%s ", my_message.type,    
        &my_message.text);
 
}
 
printf("\n\n\n");
 
/* кезекті өшіру */ 
msgctl(qId, IPC_RMID, NULL);
 
_exit(0);
 
break;
 
default:
 
/* аталық денесі */
 
printf("Queue ID: %d\n",getpid());
 
/* кезекті құру */
 
qId = msgget(getpid(), IPC_CREAT | 0666 );
 
if (qId == -1)
 
{
 
printf("Unable to create queue\n");  
kill(pid, SIGKILL);
 
_exit(0);
 
}
 
printf("s> ");
 
for (i='A'; i<='Z'; i++)
 
{
 
/* хабарламаны құру*/  
my_message.type = i - 'A' + 1; 
my_message.text[0] = i;  
my_message.text[1] = 0;  
print ("%d:%s ", my_message.type,  
       &my_message.text);
 
/* хабарламаны кезекке салу */  
msgsnd(qId, &my_message, 2, 0);
 
}  
printf("\n\n\n");
 


221 
 
 
/* топтың аяқталуын күту */
 
wait(&status);
 
return 0;
 
}
 

 
Бұл жұмыстардың нәтижесінде экранға келесі мәтін шығады:
 
Queue ID: 3952
 
s> 1:A 2:B 3:C 4:D 5:E 6:F 7:G 8:H 9:I 10:J 
11:K 12:L 13:M 14:N 15:O 16:P 17:Q 18:R 
19:S 20:T 21:U 22:V 23:W 24:X 25:Y 26:Z
 
r> 2 6:Z 25:Y 24:X 23:W 22:V 21:U 20:T 19:S 
18:R 17:Q 16:P 15:O 14:N 13:M 12:L 11:K 
10:J 9:I 8:H 7:G 6:F 5:E 4:D 3:C 2:B 1:A
 
 «s>»  жолынан  аталықтармен  жіберілген,  «г>»  жолынан  — 
ұрақтармен қабылданатын хабарламалар басталады. Әрі қарай экранға 
идентификатор  -  мәтін  жұбы,  хабарламаны  кезекке  салынуы  немесе 
алынуы шығады.  
 
 
 


Достарыңызбен бөлісу:
1   ...   180   181   182   183   184   185   186   187   ...   220




©emirsaba.org 2024
әкімшілігінің қараңыз

    Басты бет