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



Pdf көрінісі
бет130/158
Дата01.07.2023
өлшемі3.83 Mb.
#475485
түріОқулық
1   ...   126   127   128   129   130   131   132   133   ...   158
операциялық жуйелер

~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   ...   126   127   128   129   130   131   132   133   ...   158




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

    Басты бет