|
![]() |
|
![]() Á×ÔÏÒ Leonardo Giordani <leo.giordani(at)libero.it> ï Á×ÔÏÒÅ: óÔÕÄÅÎÔ ðÏÌÉÔÅÈÎÉÞÅÓËÏÇÏ õÎÉ×ÅÒÓÉÔÅÔÁ íÉÌÁÎÁ, ÕÞÉÔÓÑ ÎÁ ÆÁËÕÌØÔÅÔÅ
ÔÅÌÅËÏÍÍÕÎÉËÁÃÉÏÎÎÙÈ ÔÅÈÎÏÌÏÇÉÊ, ÒÁÂÏÔÁÅÔ ÓÅÔÅ×ÙÍ ÁÄÍÉÎÉÓÔÒÁÔÏÒÏÍ É
ÉÎÔÅÒÅÓÕÅÔÓÑ ÐÒÏÇÒÁÍÍÉÒÏ×ÁÎÉÅÍ (× ÏÓÎÏ×ÎÏÍ ÎÁ áÓÓÅÍÂÌÅÒÅ É C/C++).
ó 1999 ÐÒÁËÔÉÞÅÓËÉ ÐÏÓÔÏÑÎÎÏ ÒÁÂÏÔÁÅÔ × Linux/Unix.
|
òÅÚÀÍÅ:
ãÅÌØÀ ÄÁÎÎÏÊ ÓÅÒÉÉ ÓÔÁÔÅÊ Ñ×ÌÑÅÔÓÑ ÏÚÎÁËÏÍÌÅÎÉÅ ÞÉÔÁÔÅÌÑ Ó ËÏÎÃÅÐÃÉÅÊ ÍÎÏÇÏÚÁÄÁÞÎÏÓÔÉ É Å£ ÒÅÁÌÉÚÁÃÉÅÊ × ÏÐÅÒÁÃÉÏÎÎÏÊ ÓÉÓÔÅÍÅ Linux. îÁÞÁ× Ó ÔÅÏÒÅÔÉÞÅÓËÉÈ ÏÓÎÏ×, ÍÙ ÚÁËÏÎÞÉÍ ÎÁÐÉÓÁÎÉÅÍ ÐÏÌÎÏÃÅÎÎÏÊ ÐÒÏÇÒÁÍÍÙ, ÄÅÍÏÎÓÔÒÉÒÕÀÝÅÊ ×ÚÁÉÍÏÄÅÊÓÔ×ÉÅ ÍÅÖÄÕ ÐÒÏÃÅÓÓÁÍÉ, Ó ÐÒÏÓÔÙÍ, ÎÏ ÜÆÆÅËÔÉ×ÎÙÍ ÐÒÏÔÏËÏÌÏÍ ËÏÍÍÕÎÉËÁÃÉÉ.
þÔÏ ÎÅÏÂÈÏÄÉÍÏ ÚÎÁÔØ ÄÌÑ ÐÏÎÉÍÁÎÉÑ ÄÁÎÎÏÊ ÓÔÁÔØÉ:
üÔÏ Ó×ÏÊÓÔ×Ï ÓÉÓÔÅÍÙ Ñ×ÌÑÅÔÓÑ ÆÕÎÄÁÍÅÎÔÁÌØÎÙÍ, ÜÔÏ ``ËÏÎÔÒÏÌØ ×ÙÐÏÌÎÅÎÉÑ ÐÒÏÃÅÓÓÏ×'', ËÏÎÔÒÏÌØ ÄÏ ÔÁËÏÊ ÓÔÅÐÅÎÉ, ÞÔÏ ÐÒÏÃÅÓÓÙ ÉÓÐÏÌÎÑÀÔÓÑ × Ó×ÏÉÈ ÓÏÂÓÔ×ÅÎÎÙÈ ÁÄÒÅÓÎÙÈ ÐÒÏÓÔÒÁÎÓÔ×ÁÈ. ðÏÔÅÒÑ ËÏÎÔÒÏÌÑ ÎÁÄ ×ÙÐÏÌÎÅÎÉÅÍ ÐÒÏÃÅÓÓÁ ÐÒÉ×ÏÄÉÔ ÒÁÚÒÁÂÏÔÞÉËÁ Ë ÐÒÏÂÌÅÍÅ ÓÉÎÈÒÏÎÉÚÁÃÉÉ, ËÏÔÏÒÕÀ ÍÏÖÎÏ ×ÙÒÁÚÉÔØ ÓÌÅÄÕÀÝÉÍ ×ÏÐÒÏÓÏÍ: ËÁË ÓÄÅÌÁÔØ ×ÏÚÍÏÖÎÏÊ ÓÏ×ÍÅÓÔÎÕÀ ÒÁÂÏÔÕ Ä×ÕÈ ÐÒÏÃÅÓÓÏ×?
îÁ ÓÁÍÏÍ ÄÅÌÅ ÐÒÏÂÌÅÍÁ ÎÅÓËÏÌØËÏ ÂÏÌÅÅ ÓÌÏÖÎÁÑ, ÞÅÍ ÍÏÖÅÔ ÐÏËÁÚÁÔØÓÑ: ÜÔÏ ÎÅ ÔÏÌØËÏ ×ÏÐÒÏÓ ÏÄÎÏ×ÒÅÍÅÎÎÏÊ ÒÁÂÏÔÙ ÐÒÏÇÒÁÍÍ, ÎÏ ÔÁËÖÅ É ×ÏÐÒÏÓ ÏÄÎÏ×ÒÅÍÅÎÎÏÇÏ ÉÓÐÏÌØÚÏ×ÁÎÉÑ ÏÄÎÉÈ ÄÁÎÎÙÈ, ËÁË ÄÌÑ ÞÔÅÎÉÑ, ÔÁË É ÄÌÑ ÚÁÐÉÓÉ.
ðÏÇÏ×ÏÒÉÍ Ï ÎÅËÏÔÏÒÙÈ ËÌÁÓÓÉÞÅÓËÉÈ ÐÒÏÂÌÅÍÁÈ ÏÄÎÏ×ÒÅÍÅÎÎÏÇÏ ÉÓÐÏÌØÚÏ×ÁÎÉÑ ÄÁÎÎÙÈ; ÅÓÌÉ Ä×Á ÐÒÏÃÅÓÓÁ ÏÄÎÏ×ÒÅÍÅÎÎÏ ÞÉÔÁÀÔ ÏÄÉÎ ÎÁÂÏÒ ÄÁÎÎÙÈ, ÔÏ ÜÔÏ, ÏÞÅ×ÉÄÎÏ, ÎÅ ÓÏÚÄÁ£Ô ÐÒÏÂÌÅÍ, É ×ÙÐÏÌÎÅÎÉÅ ÐÒÏÃÅÓÓÏ× — ÐÏÓÌÅÄÏ×ÁÔÅÌØÎÏÅ. ðÕÓÔØ ÔÅÐÅÒØ ÏÄÉÎ ÐÒÏÃÅÓÓ ÉÚÍÅÎÑÅÔ ÎÁÂÏÒ ÄÁÎÎÙÈ: ÒÅÚÕÌØÔÁÔ ÒÁÂÏÔÙ ×ÔÏÒÏÇÏ ÐÒÏÃÅÓÓÁ ÂÕÄÅÔ ÚÁ×ÉÓÅÔØ ÏÔ ÔÏÇÏ, ÐÒÏÞ£Ì ÐÒÏÃÅÓÓ ÄÁÎÎÙÅ ÄÏ ÉÌÉ ÐÏÓÌÅ ÉÈ ÉÚÍÅÎÅÎÉÑ. îÁÐÒÉÍÅÒ: Õ ÎÁÓ ÅÓÔØ Ä×Á ÐÒÏÃÅÓÓÁ "á" É "÷" É ÃÅÌÏÅ ÞÉÓÌÏ "d". ðÒÏÃÅÓÓ á Õ×ÅÌÉÞÉ×ÁÅÔ d ÎÁ ÅÄÉÎÉÃÕ, ÐÒÏÃÅÓÓ ÷ ÐÅÞÁÔÁÅÔ ÚÎÁÞÅÎÉÅ d. üÔÏ ÍÏÖÎÏ ÚÁÐÉÓÁÔØ ÎÁ ÕÓÌÏ×ÎÏÍ ÑÚÙËÅ ÔÁË:
A { d->d+1 } & B { d->output }
ÚÄÅÓØ "&" ÏÚÎÁÞÁÅÔ ÏÄÎÏ×ÒÅÍÅÎÎÏÅ ×ÙÐÏÌÎÅÎÉÅ ÐÒÏÃÅÓÓÏ×. óÎÁÞÁÌÁ ÍÏÖÅÔ ÂÙÔØ ×ÙÐÏÌÎÅÎ ÐÒÏÃÅÓÓ á,(-) d = 5 (A) d = 6 (B) output = 6
Á ÍÏÖÅÔ É ÐÒÏÃÅÓÓ ÷:(-) d = 5 (B) output = 5 (A) d = 6
óÒÁÚÕ ÐÏÎÑÔÎÏ, ËÁË ×ÁÖÎÏ ÕÍÅÔØ ÐÒÁ×ÉÌØÎÏ ÏÂÒÁÝÁÔØÓÑ Ó ÔÁËÉÍÉ ÓÉÔÕÁÃÉÑÍÉ: ÒÉÓË ÐÒÏÔÉ×ÏÒÅÞÉ×ÏÓÔÉ ÄÁÎÎÙÈ ×ÙÓÏË É ÎÅÐÒÉÅÍÌÅÍ. åÓÌÉ ×Ù ×Ó£ ÅÝ£ ÎÅÄÏÏÃÅÎÉ×ÁÅÔÅ ÜÔÕ ÐÒÏÂÌÅÍÕ, ÐÒÅÄÓÔÁ×ØÔÅ, ÞÔÏ ÎÁÂÏÒ ÄÁÎÎÙÈ — ÜÔÏ ×ÁÛ ÂÁÎËÏ×ÓËÉÊ ÓÞ£Ô...÷ ÐÒÅÄÙÄÕÝÅÊ ÓÔÁÔØÅ ÍÙ ÕÖÅ ÇÏ×ÏÒÉÌÉ Ï ÐÅÒ×ÏÍ ÓÐÏÓÏÂÅ ÓÉÎÈÒÏÎÉÚÁÃÉÉ --- ÉÓÐÏÌØÚÏ×ÁÎÉÉ ÆÕÎËÃÉÉ waitpid(2), ÐÏÚ×ÏÌÑÀÝÅÊ ÐÒÏÃÅÓÓÕ ÐÏÄÏÖÄÁÔØ ÚÁ×ÅÒÛÅÎÉÑ ÄÒÕÇÏÇÏ ÐÒÏÃÅÓÓÁ, ÒÁÂÏÔÁÀÝÅÇÏ ÎÁ ÔÏÍ ÖÅ ÎÁÂÏÒÅ ÄÁÎÎÙÈ, É ÔÏÌØËÏ ÚÁÔÅÍ ÐÒÏÄÏÌÖÉÔØ Ó×ÏÀ ÒÁÂÏÔÕ.
ïÞÅ×ÉÄÎÏ, ÜÔÏ ÎÅ ÓÁÍÙÊ ÌÕÞÛÉÊ ÓÐÏÓÏÂ: ÐÒÏÃÅÓÓ ×ÙÎÕÖÄÅÎ ÐÒÏÓÔÁÉ×ÁÔØ × ÏÖÉÄÁÎÉÉ ÚÁ×ÅÒÛÅÎÉÑ ÒÁÂÏÔÙ ×ÔÏÒÙÍ ÐÒÏÃÅÓÓÏÍ. îÅÐÒÉÑÔÎÏÓÔØ ÚÁËÌÀÞÁÅÔÓÑ × ÔÏÍ, ÞÔÏ ×ÔÏÒÏÊ ÐÒÏÃÅÓÓ ÍÏÖÅÔ ÒÁÂÏÔÁÔØ ÄÏ×ÏÌØÎÏ ÄÏÌÇÏ, Á ÏÂÝÉÍÉ ÄÁÎÎÙÍÉ ÐÏÌØÚÏ×ÁÔØÓÑ ×ÅÓØÍÁ ËÏÒÏÔËÉÊ ÐÒÏÍÅÖÕÔÏË ×ÒÅÍÅÎÉ. ôÁËÉÍ ÏÂÒÁÚÏÍ, ÎÁÍ ÎÅÏÂÈÏÄÉÍÏ Õ×ÅÌÉÞÉÔØ "ÇÒÁÎÕÌÉÒÏ×ÁÎÎÏÓÔØ" ÎÁÛÅÇÏ ÕÐÒÁ×ÌÅÎÉÑ, Ô.Å. ÕÐÒÁ×ÌÑÔØ ÏÔÄÅÌØÎÙÍÉ ÎÁÂÏÒÁÍÉ ÄÁÎÎÙÈ. òÅÛÅÎÉÅ ÄÁÎÎÏÊ ÐÒÏÂÌÅÍÙ — ÐÒÉÍÉÔÉ×Ù ÉÚ ÓÔÁÎÄÁÒÔÎÏÊ ÂÉÂÌÉÏÔÅËÉ, ÉÚ×ÅÓÔÎÏÊ ËÁË SysV IPC (÷ÚÁÉÍÏÄÅÊÓÔ×ÉÅ ÐÒÏÃÅÓÓÏ× × System V).
key_t ftok(const char *pathname, int proj_id);
äÌÑ ÇÅÎÅÒÉÒÏ×ÁÎÉÑ ËÌÀÞÁ ftok ÂÅÒ£Ô ÉÍÑ ÓÕÝÅÓÔ×ÕÀÝÅÇÏ ÆÁÊÌÁ (pathname) É ÉÄÅÎÔÉÆÉËÁÔÏÒ ÐÒÏÃÅÓÓÁ (proj_id). áÌÇÏÒÉÔÍ ÐÏÓÔÒÏÅÎÉÑ ËÌÀÞÁ ÎÅ ÉÓËÌÀÞÁÅÔ ×ÏÚÍÏÖÎÏÓÔÉ ÐÏÑ×ÌÅÎÉÑ ÄÕÂÌÉËÁÔÏ×, ÐÏÜÔÏÍÕ ÓÌÅÄÕÅÔ ÉÍÅÔØ ÍÁÌÅÎØËÕÀ ÂÉÂÌÉÏÔÅËÕ, ÐÒÏÓÍÁÔÒÉ×ÁÀÝÕÀ ÕÖÅ ÓÏÚÄÁÎÎÙÅ ËÌÀÞÉ É ÎÅ ÄÏÐÕÓËÁÀÝÕÀ ÐÏ×ÔÏÒÅÎÉÊ.óÅÍÁÆÏÒÙ ÍÏÇÕÔ ÉÓÐÏÌØÚÏ×ÁÔØÓÑ ÄÌÑ ËÏÎÔÒÏÌÉÒÏ×ÁÎÉÑ ÄÏÓÔÕÐÁ Ë ÒÅÓÕÒÓÁÍ: ÞÉÓÌÏ × ÓÅÍÁÆÏÒÅ ÐÒÅÄÓÔÁ×ÌÑÅÔ ÓÏÂÏÊ ËÏÌÉÞÅÓÔ×Ï ÐÒÏÃÅÓÓÏ×, ËÏÔÏÒÙÅ ÍÏÇÕÔ ÐÏÌÕÞÉÔØ ÄÏÓÔÕÐ Ë ÄÁÎÎÙÍ. ëÁÖÄÙÊ ÒÁÚ, ËÏÇÄÁ ÐÒÏÃÅÓÓ ÏÂÒÁÝÁÅÔÓÑ Ë ÄÁÎÎÙÍ, ÚÎÁÞÅÎÉÅ × ÓÅÍÁÆÏÒÅ, ÄÏÌÖÎÏ ÂÙÔØ ÕÍÅÎØÛÅÎÏ ÎÁ ÅÄÉÎÉÃÕ, É Õ×ÅÌÉÞÅÎÏ, ËÏÇÄÁ ÒÁÂÏÔÁ Ó ÄÁÎÎÙÍÉ ÂÕÄÅÔ ÐÒÅËÒÁÝÅÎÁ. åÓÌÉ ÒÅÓÕÒÓ ÜËÓËÌÀÚÉ×ÎÙÊ, ÔÏ ÅÓÔØ Ë ÄÁÎÎÙÍ ÄÏÌÖÅÎ ÉÍÅÔØ ÄÏÓÔÕÐ ÔÏÌØËÏ ÏÄÉÎ ÐÒÏÃÅÓÓ, ÔÏ ÎÁÞÁÌØÎÏÅ ÚÎÁÞÅÎÉÅ × ÓÅÍÁÆÏÒÅ ÓÌÅÄÕÅÔ ÕÓÔÁÎÏ×ÉÔØ ÅÄÉÎÉÃÅÊ.
óÅÍÁÆÏÒÙ ÍÏÖÎÏ ÉÓÐÏÌØÚÏ×ÁÔØ É ÄÌÑ ÄÒÕÇÉÈ ÃÅÌÅÊ, ÎÁÐÒÉÍÅÒ ÄÌÑ ÓÞ£ÔÞÉËÁ ÒÅÓÕÒÓÏ×. ÷ ÜÔÏÍ ÓÌÕÞÁÅ ÞÉÓÌÏ × ÓÅÍÁÆÏÒÅ — ËÏÌÉÞÅÓÔ×Ï Ó×ÏÂÏÄÎÙÈ ÒÅÓÕÒÓÏ× (ÎÁÐÒÉÍÅÒ ËÏÌÉÞÅÓÔ×Ï Ó×ÏÂÏÄÎÙÈ ÑÞÅÅË ÐÁÍÑÔÉ).
òÁÓÓÍÏÔÒÉÍ ÐÒÁËÔÉÞÅÓËÏÅ ÐÒÉÍÅÎÅÎÉÅ ÓÅÍÁÆÏÒÏ×. ðÕÓÔØ Õ ÎÁÓ ÅÓÔØ ÂÕÆÅÒ, × ËÏÔÏÒÙÊ ÎÅÓËÏÌØËÏ ÐÒÏÃÅÓÓÏ× S1,...,Sn ÍÏÇÕÔ ÐÉÓÁÔØ, É ÔÏÌØËÏ ÏÄÉÎ ÐÒÏÃÅÓÓ L ÍÏÖÅÔ ÉÚ ÎÅÇÏ ÞÉÔÁÔØ. ôÁËÖÅ ÏÐÅÒÁÃÉÉ ÎÅÌØÚÑ ×ÙÐÏÌÎÑÔØ ÏÄÎÏ×ÒÅÍÅÎÎÏ (× ÄÁÎÎÙÊ ÍÏÍÅÎÔ ×ÒÅÍÅÎÉ ÔÏÌØËÏ ÏÄÉÎ ÐÒÏÃÅÓÓ ÄÏÌÖÅÎ ÏÐÅÒÉÒÏ×ÁÔØ Ó ÂÕÆÅÒÏÍ). ïÞÅ×ÉÄÎÏ, ÞÔÏ ÐÒÏÃÅÓÓÙ Si ÍÏÇÕÔ ÐÉÓÁÔØ ×ÓÅÇÄÁ, ËÏÇÄÁ ÂÕÆÅÒ ÎÅ ÐÏÌÏÎ, Á ÐÒÏÃÅÓÓ L ÍÏÖÅÔ ÞÉÔÁÔØ, ËÏÇÄÁ ÂÕÆÅÒ ÎÅ ÐÕÓÔ. ôÁËÉÍ ÏÂÒÁÚÏÍ, ÎÁÍ ÎÅÏÂÈÏÄÉÍÏ ÔÒÉ ÓÅÍÁÆÏÒÁ: ÏÄÉÎ ÕÐÒÁ×ÌÑÅÔ ÄÏÓÔÕÐÏÍ Ë ÂÕÆÅÒÕ, Á Ä×Á ÄÒÕÇÉÈ ÓÌÅÄÑÔ ÚÁ ÞÉÓÌÏÍ ÜÌÅÍÅÎÔÏ× × Î£Í.
õÞÉÔÙ×ÁÑ, ÞÔÏ ÄÏÓÔÕÐ Ë ÂÕÆÅÒÕ ÄÏÌÖÅÎ ÂÙÔØ ÜËÓËÌÀÚÉ×ÎÙÍ, ÐÅÒ×ÙÊ ÓÅÍÁÆÏÒ ÂÕÄÅÔ ÂÉÎÁÒÎÙÍ (ÅÇÏ ÚÎÁÞÅÎÉÅ ÂÕÄÅÔ ÎÕÌ£Í ÉÌÉ ÅÄÉÎÉÃÅÊ), × ÔÏ ×ÒÅÍÑ ËÁË ×ÔÏÒÏÊ É ÔÒÅÔÉÊ ÂÕÄÕÔ ÐÒÉÎÉÍÁÔØ ÚÎÁÞÅÎÉÑ, ÚÁ×ÉÓÑÝÉÅ ÏÔ ÒÁÚÍÅÒÁ ÂÕÆÅÒÁ.
òÁÓÓÍÏÔÒÉÍ, ËÁË ÒÅÁÌÉÚÏ×ÁÎÙ ÓÅÍÁÆÏÒÙ ÎÁ C, × SysV. óÏÚÄÁ£Ô ÓÅÍÁÆÏÒ ÆÕÎËÃÉÑ semget(2)
int semget(key_t key, int nsems, int semflg);
ÚÄÅÓØ key — IPC ËÌÀÞ, nsems — ÞÉÓÌÏ ÓÅÍÁÆÏÒÏ×, ËÏÔÏÒÏÅ ÍÙ ÈÏÔÉÍ ÓÏÚÄÁÔØ, É semflg — ÐÒÁ×Á ÄÏÓÔÕÐÁ, ÚÁËÏÄÉÒÏ×ÁÎÎÙÅ × 12 ÂÉÔ: ÐÅÒ×ÙÅ ÔÒÉ ÂÉÔÁ ÏÔ×ÅÞÁÀÔ ÚÁ ÒÅÖÉÍ ÓÏÚÄÁÎÉÑ, ÏÓÔÁÌØÎÙÅ ÄÅ×ÑÔØ — ÐÒÁ×Á ÎÁ ÚÁÐÉÓØ É ÞÔÅÎÉÅ ÄÌÑ ÐÏÌØÚÏ×ÁÔÅÌÑ, ÇÒÕÐÐÙ É ÏÓÔÁÌØÎÙÈ (ÚÁÍÅÔØÔÅ ÓÈÏÄÓÔ×Ï Ó ÆÁÊÌÏ×ÏÊ ÓÉÓÔÅÍÏÊ × Unix). úÁ ÂÏÌÅÅ ÐÏÌÎÏÊ ÉÎÆÏÒÍÁÃÉÅÊ ÚÁÇÌÑÎÉÔÅ × man ÓÔÒÁÎÉÃÙ ipc(5). ëÁË ×Ù ×ÉÄÉÔÅ SysV ÓÏÚÄÁ£Ô ÓÒÁÚÕ ÎÅÓËÏÌØËÏ ÓÅÍÁÆÏÒÏ×, ÞÔÏ ÕÍÅÎØÛÁÅÔ ËÏÄ.äÁ×ÁÊÔÅ ÓÏÚÄÁÄÉÍ ÎÁÛ ÐÅÒ×ÙÊ ÓÅÍÁÆÏÒ
#include <stdio.h> #include <stdlib.h> #include <linux/types.h> #include <linux/ipc.h> #include <linux/sem.h> int main(void) { key_t key; int semid; key = ftok("/etc/fstab", getpid()); /* ÓÏÚÄÁÔØ ÔÏÌØËÏ ÏÄÉÎ ÓÅÍÁÆÏÒ: */ semid = semget(key, 1, 0666 | IPC_CREAT); return 0; }äÁÌÅÅ ÎÁÍ ÎÁÄÏ ×ÙÑÓÎÉÔØ ËÁË ÕÐÒÁ×ÌÑÔØ ÓÅÍÁÆÏÒÁÍÉ, É ËÁË ÕÄÁÌÑÔØ ÉÈ. õÐÒÁ×ÌÅÎÉÅ ÐÒÏÉÓÈÏÄÉÔ Ó ÐÏÍÏÝØÀ ÆÕÎËÃÉÉ semctl(2),
int semctl(int semid, int semnum, int cmd, ...)
ËÏÔÏÒÁÑ ×ÙÐÏÌÎÑÅÔ ÄÅÊÓÔ×ÉÅ cmd ÎÁ ÎÁÂÏÒÅ ÓÅÍÁÆÏÒÏ× semid ÉÌÉ (ÅÓÌÉ ÔÒÅÂÕÅÔÓÑ ËÏÍÁÎÄÏÊ) ÎÁ ÏÄÎÏÍ ÓÅÍÁÆÏÒÅ Ó ÎÏÍÅÒÏÍ semnum. íÙ ÒÁÓÓËÁÖÅÍ Ï Ó×ÏÊÓÔ×ÁÈ ÜÔÏ ËÏÍÁÎÄÙ, ËÏÇÄÁ ÓÔÁÎÅÔ ÎÅÏÂÈÏÄÉÍÏ, ÐÏÌÎÙÊ ÖÅ ÓÐÉÓÏË Ó×ÏÊÓÔ× ÄÏÓÔÕÐÅÎ ÎÁ man ÓÔÒÁÎÉÃÁÈ. ÷ ÚÁ×ÉÓÉÍÏÓÔÉ ÏÔ ËÏÍÁÎÄÙ, ÍÏÖÅÔ ÐÏÎÁÄÏÂÉÔÓÑ ÕËÁÚÁÔØ ÅÝ£ ÏÄÉÎ ÁÒÇÕÍÅÎÔ ÓÌÅÄÕÀÝÅÇÏ ÔÉÐÁ:union semun { int val; /* ÚÎÁÞÅÎÉÅ ÄÌÑ SETVAL */ struct semid_ds *buf; /* ÂÕÆÅÒÙ ÄÌÑ IPC_STAT, IPC_SET */ unsigned short *array; /* ÍÁÓÓÉ×Ù ÄÌÑ GETALL, SETALL */ /* ÞÁÓÔØ, ÏÓÏÂÅÎÎÁÑ ÄÌÑ Linux: */ struct seminfo *__buf; /* ÂÕÆÅÒ ÄÌÑ IPC_INFO */ };þÔÏÂÙ ÉÚÍÅÎÉÔØ ÚÎÁÞÅÎÉÅ ÓÅÍÁÆÏÒÁ, ÉÓÐÏÌØÚÕÀÔ ÄÉÒÅËÔÉ×Õ SETVAL, ÎÏ×ÏÅ ÚÎÁÞÅÎÉÅ ÄÏÌÖÎÏ ÂÙÔØ ÕËÁÚÁÎÏ × semun; ÄÁ×ÁÊÔÅ ÍÏÄÉÆÉÃÉÒÕÅÍ ÐÒÉ×ÅÄ£ÎÎÕÀ ×ÙÛÅ ÐÒÏÇÒÁÍÍÕ, ÕÓÔÁÎÁ×ÌÉ×ÁÑ × ÓÅÍÁÆÏÒÅ ÚÎÁÞÅÎÉÅ 1.
[...] /* ÓÏÚÄÁÔØ ÔÏÌØËÏ ÏÄÉÎ ÓÅÍÁÆÏÒ */ semid = semget(key, 1, 0666 | IPC_CREAT); /* × ÓÅÍÁÆÏÒÅ 0 ÕÓÔÁÎÏ×ÉÔØ ÚÎÁÞÅÎÉÅ 1 */ arg.val = 1; semctl(semid, 0, SETVAL, arg); [...]ôÅÐÅÒØ ÎÅÏÂÈÏÄÉÍÏ ÕÄÁÌÉÔØ ÓÅÍÁÆÏÒ, ÏÓ×ÏÂÏÖÄÁÑ ÓÔÒÕËÔÕÒÙ, ÉÓÐÏÌØÚÏ×Á×ÛÉÅÓÑ ÄÌÑ ÕÐÒÁ×ÌÅÎÉÑ ÉÍ; ÜÔÏ ×ÙÐÏÌÎÑÅÔ ÄÉÒÅËÔÉ×Á IPC_RMID. ïÎÁ ÕÄÁÌÑÅÔ ÓÅÍÁÆÏÒ É ÐÏÓÙÌÁÅÔ ÓÏÏÂÝÅÎÉÅ Ï ÜÔÏÍ ×ÓÅÍ ÐÒÏÃÅÓÓÁÍ, ÏÖÉÄÁÀÝÉÍ ÄÏÓÔÕÐÁ Ë ÒÅÓÕÒÓÕ. ðÏÓÌÅÄÎÉÊ ÒÁÚ ÉÚÍÅÎÉÍ ÐÒÏÇÒÁÍÍÕ:
[...] /* × ÓÅÍÁÆÏÒÅ 0 ÕÓÔÁÎÏ×ÉÔØ ÚÎÁÞÅÎÉÅ 1 */ arg.val = 1; semctl(semid, 0, SETVAL, arg); /* ÕÄÁÌÉÔØ ÓÅÍÁÆÏÒ */ semctl(semid, 0, IPC_RMID); [...]ëÁË ×Ù ÕÖÅ ÐÏÎÑÌÉ, ÓÏÚÄÁÎÉÅ É ÕÐÒÁ×ÌÅÎÉÅ ÓÔÒÕËÔÕÒÁÍÉ ËÏÎÔÒÏÌÑ ÚÁ ÐÁÒÁÌÌÅÌØÎÙÍ ×ÙÐÏÌÎÅÎÉÅÍ ÐÒÏÇÒÁÍÍ ÄÏÓÔÁÔÏÞÎÏ ÐÒÏÓÔÏ, ËÏÇÄÁ ÍÙ ÄÏÂÁ×ÉÍ ÏÂÒÁÂÏÔËÕ ÏÛÉÂÏË, ×Ó£ ÓÔÁÎÅÔ ÎÅÓËÏÌØËÏ ÂÏÌÅÅ ÓÌÏÖÎÏ, ÎÏ ÔÏÌØËÏ × ÓÍÙÓÌÅ ÓÌÏÖÎÏÓÔÉ ËÏÄÁ.
éÓÐÏÌØÚÏ×ÁÔØ ÓÅÍÁÆÏÒ ÍÏÖÎÏ Ó ÐÏÍÏÝØÀ ÐÒÏÃÅÄÕÒÙ semop(2),
int semop(int semid, struct sembuf *sops, unsigned nsops);
ÚÄÅÓØ semid — ÉÄÅÎÔÉÆÉËÁÔÏÒ ÎÁÂÏÒÁ ÓÅÍÁÆÏÒÏ×, sops — ÍÁÓÓÉ×, ÓÏÄÅÒÖÁÝÉÊ ÏÐÅÒÁÃÉÉ, ËÏÔÏÒÙÅ ÎÅÏÂÈÏÄÉÍÏ ÐÒÏÉÚ×ÅÓÔÉ, nsops — ÞÉÓÌÏ ÜÔÉÈ ÏÐÅÒÁÃÉÊ. ëÁÖÄÁÑ ÏÐÅÒÁÃÉÑ ÐÒÅÄÓÔÁ×ÌÑÅÔÓÑ ÓÔÒÕËÔÕÒÏÊ sembuf.unsigned short sem_num; short sem_op; short sem_flg;
Ô.Å ÎÏÍÅÒÏÍ ÓÅÍÁÆÏÒÁ × ÍÎÏÖÅÓÔ×Å (sem_num), ÏÐÅÒÁÃÉÅÊ (sem_op) É ÆÌÁÇÏÍ, ÕÓÔÁÎÁ×ÌÉ×ÁÀÝÉÍ ÒÅÖÉÍ ÏÖÉÄÁÎÉÑ; ÐÕÓÔØ ÐÏËÁ ÏÎ ÂÕÄÅÔ ÎÕÌ£Í. ïÐÅÒÁÃÉÉ, ËÏÔÏÒÙÅ ÍÙ ÍÏÖÅÍ ÕËÁÚÁÔØ, Ñ×ÌÑÀÔÓÑ ÃÅÌÙÍÉ ÞÉÓÌÁÍÉ É ÐÏÄÞÉÎÑÀÔÓÑ ÓÌÅÄÕÀÝÉÍ ÐÒÁ×ÉÌÁÍ:þÔÅÎÉÅ É ÚÁÐÉÓØ × ÂÕÆÅÒ ÎÁ ÓÁÍÏÍ ÄÅÌÅ ÎÅÎÁÓÔÏÑÝÉÅ: ÔÁË ÐÒÏÉÓÈÏÄÉÔ ÐÏÔÏÍÕ, ÞÔÏ, ËÁË ÏÂÓÕÖÄÁÌÏÓØ × ÐÒÅÄÙÄÕÝÅÊ ÓÔÁÔØÅ, ËÁÖÄÙÊ ÐÒÏÃÅÓÓ ×ÙÐÏÌÎÑÅÔÓÑ × Ó×Ï£Í ÓÏÂÓÔ×ÅÎÎÏÊ ÏÂÌÁÓÔÉ ÐÁÍÑÔÉ É ÎÅ ÍÏÖÅÔ ÏÂÒÁÝÁÔØÓÑ Ë ÐÁÍÑÔÉ ÄÒÕÇÏÇÏ ÐÒÏÃÅÓÓÁ. üÔÏ ÄÅÌÁÅÔ ÎÁÓÔÏÑÝÅÅ ÕÐÒÁ×ÌÅÎÉÅ ÂÕÆÅÒÏÍ ÛÅÓÔØÀ ÐÒÏÃÅÓÓÁÍÉ ÎÅ×ÏÚÍÏÖÎÙÍ, ÔÁË ËÁË ËÁÖÄÙÊ ÐÒÏÃÅÓÓ ÂÕÄÅÔ ×ÉÄÅÔØ Ó×ÏÀ ËÏÐÉÀ ÂÕÆÅÒÁ. ×Ó£ ×ÓÔÁÎÅÔ ÎÁ Ó×ÏÉ ÍÅÓÔÁ, ËÏÇÄÁ ÍÙ ÂÕÄÅÍ ÇÏ×ÏÒÉÔØ Ï ÒÁÚÄÅÌÑÅÍÏÊ ÐÁÍÑÔÉ, ÎÏ ÄÁ×ÁÊÔÅ ÂÙÔØ ÐÏÓÌÅÄÏ×ÁÔÅÌØÎÙÍÉ.
ðÏÞÅÍÕ ÎÁÍ ÎÕÖÎÏ ÔÒÉ ÓÅÍÁÆÏÒÁ? ðÅÒ×ÙÊ (Ó ÎÏÍÅÒÏÍ 0) ÄÅÊÓÔ×ÕÅÔ ËÁË ÚÁÍÏË Ë ÂÕÆÅÒÕ, É ÅÇÏ ÍÁËÓÉÍÁÌØÎÏÅ ÚÎÁÞÅÎÉÅ ÒÁ×ÎÏ ÅÄÉÎÉÃÅ, ÏÓÔÁÌØÎÙÅ Ä×Á ÏÔ×ÅÞÁÀÔ ÚÁ ÐÅÒÅÐÏÌÎÅÎÉÅ É ÎÁÌÉÞÉÅ ÜÌÅÍÅÎÔÏ× × ÂÕÆÅÒÅ. ïÄÎÉÍ ÓÅÍÁÆÏÒÏÍ ÜÔÏÇÏ ÎÅ ÄÏÂÉÔØÓÑ.
ðÏÔÒÅÂÎÏÓÔØ × Ä×ÕÈ ÓÅÍÁÆÏÒÁÈ Ó×ÑÚÁÎÁ Ó ÏÓÏÂÅÎÎÏÓÔØÀ ÒÁÂÏÔÙ ÆÕÎËÃÉÉ semop. åÓÌÉ, ÎÁÐÒÉÍÅÒ, ÐÒÏÃÅÓÓÙ W ÕÍÅÎØÛÁÀÔ ÚÎÁÞÅÎÉÅ × ÓÅÍÁÆÏÒÅ, ÏÔ×ÅÞÁÀÝÅÍ ÚÁ Ó×ÏÂÏÄÎÏÅ ÍÅÓÔÏ × ÂÕÆÅÒÅ, ÄÏ ÎÕÌÑ, ÔÏ ÐÒÏÃÅÓÓ R ÍÏÖÅÔ Õ×ÅÌÉÞÉ×ÁÔØ ÜÔÏ ÚÎÁÞÅÎÉÅ ÄÏ ÂÅÓËÏÎÅÞÎÏÓÔÉ. ðÏÜÔÏÍÕ ÔÁËÏÊ ÓÅÍÁÆÏÒ ÎÅ ÍÏÖÅÔ ÕËÁÚÙ×ÁÔØ ÎÁ ÏÔÓÕÔÓÔ×ÉÅ ÜÌÅÍÅÎÔÏ× × ÂÕÆÅÒÅ.
#include <stdio.h> #include <stdlib.h> #include <errno.h> #include <linux/types.h> #include <linux/ipc.h> #include <linux/sem.h> int main(int argc, char *argv[]) { /* IPC */ pid_t pid; key_t key; int semid; union semun arg; struct sembuf lock_res = {0, -1, 0}; struct sembuf rel_res = {0, 1, 0}; struct sembuf push[2] = {1, -1, IPC_NOWAIT, 2, 1, IPC_NOWAIT}; struct sembuf pop[2] = {1, 1, IPC_NOWAIT, 2, -1, IPC_NOWAIT}; /* ïÓÔÁÌØÎÏÅ */ int i; if(argc < 2){ printf("Usage: bufdemo [dimensione]\n"); exit(0); } /* óÅÍÁÆÏÒÙ */ key = ftok("/etc/fstab", getpid()); /* óÏÚÄÁÔØ ÎÁÂÏÒ ÉÚ ÔÒ£È ÓÅÍÁÆÏÒÏ× */ semid = semget(key, 3, 0666 | IPC_CREAT); /* õÓÔÁÎÏ×ÉÔØ × ÓÅÍÁÆÏÒÅ ÎÏÍÅÒ 0 (ëÏÎÔÒÏÌÌÅÒ ÒÅÓÕÒÓÏ×) ÚÎÁÞÅÎÉÅ "1" */ arg.val = 1; semctl(semid, 0, SETVAL, arg); /* õÓÔÁÎÏ×ÉÔØ × ÓÅÍÁÆÏÒÅ ÎÏÍÅÒ 1 (ëÏÎÔÒÏÌÌÅÒ Ó×ÏÂÏÄÎÏÇÏ ÍÅÓÔÁ) ÚÎÁÞÅÎÉÅ ÄÌÉÎÙ ÂÕÆÅÒÁ */ arg.val = atol(argv[1]); semctl(semid, 1, SETVAL, arg); /* õÓÔÁÎÏ×ÉÔØ × ÓÅÍÁÆÏÒÅ ÎÏÍÅÒ 2 (ëÏÎÔÒÏÌÌÅÒ ÜÌÅÍÅÎÔÏ× × ÂÕÆÅÒÅ) ÚÎÁÞÅÎÉÅ "0" */ arg.val = 0; semctl(semid, 2, SETVAL, arg); /* Fork */ for (i = 0; i < 5; i++){ pid = fork(); if (!pid){ for (i = 0; i < 20; i++){ sleep(rand()%6); /* ðÏÐÙÔÁÔØÓÑ ÚÁÂÌÏËÉÒÏ×ÁÔØ ÒÅÓÕÒÓ (ÓÅÍÁÆÏÒ ÎÏÍÅÒ 0) */ if (semop(semid, &lock_res, 1) == -1){ perror("semop:lock_res"); } /* õÍÅÎØÛÉÔØ Ó×ÏÂÏÄÎÏÅ ÍÅÓÔÏ (ÓÅÍÁÆÏÒ ÎÏÍÅÒ 1) / äÏÂÁ×ÉÔØ ÜÌÅÍÅÎÔ (ÓÅÍÁÆÏÒ ÎÏÍÅÒ 2) */ if (semop(semid, &push, 2) != -1){ printf("---> Process:%d\n", getpid()); } else{ printf("---> Process:%d BUFFER FULL\n", getpid()); } /* òÁÚÂÌÏËÉÒÏ×ÁÔØ ÒÅÓÕÒÓ */ semop(semid, &rel_res, 1); } exit(0); } } for (i = 0;i < 100; i++){ sleep(rand()%3); /* ðÏÐÙÔÁÔØÓÑ ÚÁÂÌÏËÉÒÏ×ÁÔØ ÒÅÓÕÒÓ (ÓÅÍÁÆÏÒ ÎÏÍÅÒ 0)*/ if (semop(semid, &lock_res, 1) == -1){ perror("semop:lock_res"); } /* õ×ÅÌÉÞÉÔØ Ó×ÏÂÏÄÎÏÅ ÍÅÓÔÏ (ÓÅÍÁÆÏÒ ÎÏÍÅÒ 1) / ÷ÚÑÔØ ÜÌÅÍÅÎÔ (ÓÅÍÁÆÏÒ ÎÏÍÅÒ 2) */ if (semop(semid, &pop, 2) != -1){ printf("<--- Process:%d\n", getpid()); } else printf("<--- Process:%d BUFFER EMPTY\n", getpid()); /* òÁÚÂÌÏËÉÒÏ×ÁÔØ ÒÅÓÕÒÓ */ semop(semid, &rel_res, 1); } /* õÄÁÌÉÔØ ÓÅÍÁÆÏÒÙ */ semctl(semid, 0, IPC_RMID); return 0; }ðÒÏËÏÍÍÅÎÔÉÒÕÅÍ ÎÁÉÂÏÌÅÅ ÉÎÔÅÒÅÓÎÙÅ ÞÁÓÔÉ ËÏÄÁ:
struct sembuf lock_res = {0, -1, 0}; struct sembuf rel_res = {0, 1, 0}; struct sembuf push[2] = {1, -1, IPC_NOWAIT, 2, 1, IPC_NOWAIT}; struct sembuf pop[2] = {1, 1, IPC_NOWAIT, 2, -1, IPC_NOWAIT};üÔÉ ÞÅÔÙÒÅ ÓÔÒÏËÉ — ÄÅÊÓÔ×ÉÑ, ËÏÔÏÒÙÅ ÍÙ ÍÏÖÅÍ ÐÒÏÉÚ×ÏÄÉÔØ ÎÁÄ ÓÅÍÁÆÏÒÁÍÉ: ÐÅÒ×ÙÅ Ä×Å — ÓÏÄÅÒÖÁÔ ÐÏ ÏÄÎÏÍÕ ÄÅÊÓÔ×ÉÑ ËÁÖÄÁÑ, ×ÔÏÒÙÅ — ÐÏ Ä×Å. ðÅÒ×ÏÅ ÄÅÊÓÔ×ÉÅ, lock_res, ÂÌÏËÉÒÕÅÔ ÒÅÓÕÒÓ: ÏÎÏ ÕÍÅÎØÛÁÅÔ ÚÎÁÞÅÎÉÅ ÐÅÒ×ÏÇÏ (ÎÏÍÅÒ 0) ÓÅÍÁÆÏÒÁ ÎÁ ÅÄÉÎÉÃÕ (ÅÓÌÉ ÚÎÁÞÅÎÉÅ × ÓÅÍÁÆÏÒÅ ÎÅ ÎÕÌØ), Á ÅÓÌÉ ÒÅÓÕÒÓ ÕÖÅ ÚÁÎÑÔ, ÔÏ ÐÒÏÃÅÓÓ ÖÄ£Ô. äÅÊÓÔ×ÉÅ rel_res ÁÎÁÌÏÇÉÞÎÏ lock_res, ÔÏÌØËÏ ÚÎÁÞÅÎÉÅ × ÐÅÒ×ÏÍ ÓÅÍÁÆÏÒÅ Õ×ÅÌÉÞÉ×ÁÅÔÓÑ ÎÁ ÅÄÉÎÉÃÕ, Ô.Å. ÕÂÉÒÁÅÔÓÑ ÂÌÏËÉÒÏ×ËÁ ÒÅÓÕÒÓÁ.
äÅÊÓÔ×ÉÑ push É pop ÎÅÓËÏÌØËÏ ÏÔÌÉÞÁÀÔÓÑ ÏÔ ÐÅÒ×ÙÈ: ÜÔÏ ÍÁÓÓÉ×Ù ÉÚ Ä×ÕÈ ÄÅÊÓÔ×ÉÊ. ðÅÒ×ÏÅ ÄÅÊÓÔ×ÉÅ ÎÁÄ ÓÅÍÁÆÏÒÏÍ ÎÏÍÅÒ 1, ×ÔÏÒÏÅ — ÎÁÄ ÓÅÍÁÆÏÒÏÍ ÎÏÍÅÒ 2; ÏÄÎÏ Õ×ÅÌÉÞÉ×ÁÅÔ ÚÎÁÞÅÎÉÅ × ÓÅÍÁÆÏÒÅ, ÄÒÕÇÏÅ ÕÍÅÎØÛÁÅÔ, ÎÏ ÔÅÐÅÒØ ÐÒÏÃÅÓÓ ÎÅ ÂÕÄÅÔ ÖÄÁÔØ ÏÓ×ÏÂÏÖÄÅÎÉÑ ÒÅÓÕÒÓÁ: IPC_NOWAIT ÚÁÓÔÁ×ÌÑÅÔ ÅÇÏ ÐÒÏÄÏÌÖÉÔØ ÒÁÂÏÔÕ, ÅÓÌÉ ÒÅÓÕÒÓ ÚÁÂÌÏËÉÒÏ×ÁÎ.
/* õÓÔÁÎÏ×ÉÔØ × ÓÅÍÁÆÏÒÅ ÎÏÍÅÒ 0 (ëÏÎÔÒÏÌÌÅÒ ÒÅÓÕÒÓÏ×) ÚÎÁÞÅÎÉÅ "1" */ arg.val = 1; semctl(semid, 0, SETVAL, arg); /* õÓÔÁÎÏ×ÉÔØ × ÓÅÍÁÆÏÒÅ ÎÏÍÅÒ 1 (ëÏÎÔÒÏÌÌÅÒ Ó×ÏÂÏÄÎÏÇÏ ÍÅÓÔÁ) ÚÎÁÞÅÎÉÅ ÄÌÉÎÙ ÂÕÆÅÒÁ */ arg.val = atol(argv[1]); semctl(semid, 1, SETVAL, arg); /* õÓÔÁÎÏ×ÉÔØ × ÓÅÍÁÆÏÒÅ ÎÏÍÅÒ 2 (ëÏÎÔÒÏÌÌÅÒ ÜÌÅÍÅÎÔÏ× × ÂÕÆÅÒÅ) ÚÎÁÞÅÎÉÅ "0" */ arg.val = 0; semctl(semid, 2, SETVAL, arg);úÄÅÓØ ÍÙ ÉÎÉÃÉÁÌÉÚÉÒÕÅÍ ÚÎÁÞÅÎÉÑ × ÓÅÍÁÆÏÒÁÈ: × ÐÅÒ×ÏÍ — ÅÄÉÎÉÃÅÊ, ÔÁË ËÁË ÏÎ ËÏÎÔÒÏÌÉÒÕÅÔ ÄÏÓÔÕÐ Ë ÒÅÓÕÒÓÕ, ×Ï ×ÔÏÒÏÍ — ÄÌÉÎÏÊ ÂÕÆÅÒÁ (ÚÁÄÁÎÎÏÊ × ËÏÍÁÎÄÎÏÊ ÓÔÒÏËÅ), × ÔÒÅÔØÅÍ — ÎÕÌ£Í (Ô.Å. ÞÉÓÌÏÍ ÜÌÅÍÅÎÔÏ× × ÂÕÆÅÒÅ).
/* ðÏÐÙÔÁÔØÓÑ ÚÁÂÌÏËÉÒÏ×ÁÔØ ÒÅÓÕÒÓ (ÓÅÍÁÆÏÒ ÎÏÍÅÒ 0) */ if (semop(semid, &lock_res, 1) == -1){ perror("semop:lock_res"); } /* õÍÅÎØÛÉÔØ Ó×ÏÂÏÄÎÏÅ ÍÅÓÔÏ (ÓÅÍÁÆÏÒ ÎÏÍÅÒ 1) / äÏÂÁ×ÉÔØ ÜÌÅÍÅÎÔ (ÓÅÍÁÆÏÒ ÎÏÍÅÒ 2) */ if (semop(semid, &push, 2) != -1){ printf("---> Process:%d\n", getpid()); } else{ printf("---> Process:%d BUFFER FULL\n", getpid()); } /* ïÓ×ÏÂÏÄÉÔØ ÒÅÓÕÒÓ */ semop(semid, &rel_res, 1);ðÒÏÃÅÓÓ W ÐÙÔÁÅÔÓÑ ÚÁÂÌÏËÉÒÏ×ÁÔØ ÒÅÓÕÒÓ ÐÏÓÒÅÄÓÔ×ÏÍ ÄÅÊÓÔ×ÉÑ lock_res; ËÁË ÔÏÌØËÏ ÜÔÏ ÅÍÕ ÕÄÁ£ÔÓÑ, ÏÎ ÄÏÂÁ×ÌÑÅÔ ÜÌÅÍÅÎÔ × ÂÕÆÅÒ ÐÏÓÒÅÄÓÔ×ÏÍ ÄÅÊÓÔ×ÉÑ push É ×Ù×ÏÄÉÔ ÓÏÏÂÝÅÎÉÅ Ï ÜÔÏÍ ÎÁ ÓÔÁÎÄÁÒÔÎÙÊ ×Ù×ÏÄ. åÓÌÉ ÏÐÅÒÁÃÉÑ ÎÅ ÍÏÖÅÔ ÂÙÔØ ÐÒÏÉÚ×ÅÄÅÎÁ, ÐÒÏÃÅÓÓ ×Ù×ÏÄÉÔ ÓÏÏÂÝÅÎÉÅ Ï ÚÁÐÏÌÎÅÎÉÉ ÂÕÆÅÒÁ. ÷ ËÏÎÃÅ ÐÒÏÃÅÓÓ ÏÓ×ÏÂÏÖÄÁÅÔ ÒÅÓÕÒÓ.
/* ðÏÐÙÔÁÔØÓÑ ÚÁÂÌÏËÉÒÏ×ÁÔØ ÒÅÓÕÒÓ (ÓÅÍÁÆÏÒ ÎÏÍÅÒ 0) */ if (semop(semid, &lock_res, 1) == -1){ perror("semop:lock_res"); } /* õ×ÅÌÉÞÉÔØ Ó×ÏÂÏÄÎÏÅ ÍÅÓÔÏ (ÓÅÍÁÆÏÒ ÎÏÍÅÒ 1) / ÷ÚÑÔØ ÜÌÅÍÅÎÔ (ÓÅÍÁÆÏÒ ÎÏÍÅÒ 2) */ if (semop(semid, &pop, 2) != -1){ printf("<--- Process:%d\n", getpid()); } else printf("<--- Process:%d BUFFER EMPTY\n", getpid()); /* ïÔÐÕÓÔÉÔØ ÒÅÓÕÒÓ */ semop(semid, &rel_res, 1);ðÒÏÃÅÓÓ R ×ÅÄ£Ô ÓÅÂÑ ÐÒÁËÔÉÞÅÓËÉ ÔÁË ÖÅ ËÁË É W ÐÒÏÃÅÓÓ: ÂÌÏËÉÒÕÅÔ ÒÅÓÕÒÓ, ÐÒÏÉÚ×ÏÄÉÔ ÄÅÊÓÔ×ÉÅ pop, ÏÓ×ÏÂÏÖÄÁÅÔ ÒÅÓÕÒÓ.
÷ ÓÌÅÄÕÀÝÅÊ ÓÔÁÔØÅ ÍÙ ÐÏÇÏ×ÏÒÉÍ Ï ÏÞÅÒÅÄÑÈ ÓÏÏÂÝÅÎÉÊ: ÄÒÕÇÏÊ ÓÔÒÕËÔÕÒÅ ÄÌÑ ÍÅÖÐÒÏÃÅÓÓÏ×ÏÇÏ ÏÂÝÅÎÉÑ É ÓÉÎÈÒÏÎÉÚÁÃÉÉ. ëÁË ×ÓÅÇÄÁ, ÅÓÌÉ ×Ù ÐÉÛÅÔÅ ÞÔÏ-ÎÉÂÕÄØ ÐÒÏÓÔÏÅ, ÉÓÐÏÌØÚÕÑ ÉÎÆÏÒÍÁÃÉÀ ÉÚ ÜÔÏÊ ÓÔÁÔØÉ, ÐÒÉÓÙÌÁÊÔÅ ÜÔÏ ÍÎÅ, Ó ×ÁÛÉÍ ÉÍÅÎÅÍ É e-mail ÁÄÒÅÓÏÍ, ÂÕÄÕ ÒÁÄ ÐÒÏÞÉÔÁÔØ. õÄÁÞÉ!
|
Webpages maintained by the LinuxFocus Editor team
© Leonardo Giordani, FDL LinuxFocus.org |
Translation information:
|
2003-02-06, generated by lfparser version 2.31