[LinuxFocus-icon]
äÏÍÏÊ  |  ëÁÒÔÁ  |  éÎÄÅËÓ  |  ðÏÉÓË

îÏ×ÏÓÔÉ | áÒÈÉ×Ù | óÓÙÌËÉ | ðÒÏ LF
[an error occurred while processing this directive]
[Leonardo]
Á×ÔÏÒ Leonardo Giordani
<leo.giordani(at)libero.it>

ï Á×ÔÏÒÅ:

óÔÕÄÅÎÔ ðÏÌÉÔÅÈÎÉÞÅÓËÏÇÏ õÎÉ×ÅÒÓÉÔÅÔÁ íÉÌÁÎÁ, ÕÞÉÔÓÑ ÎÁ ÆÁËÕÌØÔÅÔÅ ÔÅÌÅËÏÍÍÕÎÉËÁÃÉÏÎÎÙÈ ÔÅÈÎÏÌÏÇÉÊ, ÒÁÂÏÔÁÅÔ ÓÅÔÅ×ÙÍ ÁÄÍÉÎÉÓÔÒÁÔÏÒÏÍ É ÉÎÔÅÒÅÓÕÅÔÓÑ ÐÒÏÇÒÁÍÍÉÒÏ×ÁÎÉÅÍ (× ÏÓÎÏ×ÎÏÍ ÎÁ áÓÓÅÍÂÌÅÒÅ É C/C++). ó 1999 ÐÒÁËÔÉÞÅÓËÉ ÐÏÓÔÏÑÎÎÏ ÒÁÂÏÔÁÅÔ × Linux/Unix.

ðÅÒÅ×ÏÄ ÎÁ òÕÓÓËÉÊ:
Dmitry Martsynkevitch <ursa(at)zaba.ru>

óÏÄÅÒÖÁÎÉÅ:


 

ðÁÒÁÌÌÅÌØÎÏÅ ÐÒÏÇÒÁÍÍÉÒÏ×ÁÎÉÅ — ×ÚÁÉÍÏÄÅÊÓÔ×ÉÅ ÍÅÖÄÕ ÐÒÏÃÅÓÓÁÍÉ.

[run in paralell]

òÅÚÀÍÅ:

ãÅÌØÀ ÄÁÎÎÏÊ ÓÅÒÉÉ ÓÔÁÔÅÊ Ñ×ÌÑÅÔÓÑ ÏÚÎÁËÏÍÌÅÎÉÅ ÞÉÔÁÔÅÌÑ Ó ËÏÎÃÅÐÃÉÅÊ ÍÎÏÇÏÚÁÄÁÞÎÏÓÔÉ É Å£ ÒÅÁÌÉÚÁÃÉÅÊ × ÏÐÅÒÁÃÉÏÎÎÏÊ ÓÉÓÔÅÍÅ Linux. îÁÞÁ× Ó ÔÅÏÒÅÔÉÞÅÓËÉÈ ÏÓÎÏ×, ÍÙ ÚÁËÏÎÞÉÍ ÎÁÐÉÓÁÎÉÅÍ ÐÏÌÎÏÃÅÎÎÏÊ ÐÒÏÇÒÁÍÍÙ, ÄÅÍÏÎÓÔÒÉÒÕÀÝÅÊ ×ÚÁÉÍÏÄÅÊÓÔ×ÉÅ ÍÅÖÄÕ ÐÒÏÃÅÓÓÁÍÉ, Ó ÐÒÏÓÔÙÍ, ÎÏ ÜÆÆÅËÔÉ×ÎÙÍ ÐÒÏÔÏËÏÌÏÍ ËÏÍÍÕÎÉËÁÃÉÉ.

þÔÏ ÎÅÏÂÈÏÄÉÍÏ ÚÎÁÔØ ÄÌÑ ÐÏÎÉÍÁÎÉÑ ÄÁÎÎÏÊ ÓÔÁÔØÉ:

ôÁËÖÅ ×ÁÍ ÓÌÅÄÕÅÔ ÐÒÏÞÉÔÁÔØ ÐÅÒ×ÕÀ ÓÔÁÔØÀ ÉÚ ÜÔÏÇÏ ÃÉËÌÁ, ÐÏÓËÏÌØËÕ ÏÎÁ Ñ×ÌÑÅÔÓÑ ÏÓÎÏ×ÏÊ ÄÌÑ ÄÁÎÎÏÊ: November 2002, article 272.
_________________ _________________ _________________

 

÷×ÅÄÅÎÉÅ

îÕ ×ÏÔ É ÏÐÑÔØ ÍÙ ÂÏÒÅÍÓÑ Ó ÍÕÌØÔÉÚÁÄÁÞÎÏÓÔØÀ × 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).  

ëÌÀÞÉ SysV

ðÒÅÖÄÅ ÞÅÍ ÐÅÒÅÊÔÉ Ë ÓÁÍÏÊ ÔÅÏÒÉÉ ÏÄÎÏ×ÒÅÍÅÎÎÏÓÔÉ, ÄÁ×ÁÊÔÅ ÐÏÚÎÁËÏÍÉÍÓÑ Ó ÔÉÐÉÞÎÏÊ SysV ÓÔÒÕËÔÕÒÏÊ: IPC ËÌÀÞÁÍÉ. IPC ËÌÀÞ — ÜÔÏ ÞÉÓÌÏ, ÏÄÎÏÚÎÁÞÎÏ ÉÄÅÎÔÉÆÉÃÉÒÕÀÝÅÅ IPC ÓÔÒÕËÔÕÒÕ ÕÐÒÁ×ÌÅÎÉÑ (ÏÐÉÓÙ×ÁÅÔÓÑ ÎÉÖÅ). ôÁËÖÅ ËÌÀÞ ÍÏÖÎÏ ÉÓÐÏÌØÚÏ×ÁÔØ ÄÌÑ ÏÂÒÁÚÏ×ÁÎÉÑ ÕÎÉ×ÅÒÓÁÌØÎÙÈ ÉÄÅÎÔÉÆÉËÁÔÏÒÏ×, Ô.Å. ÄÌÑ ÏÒÇÁÎÉÚÁÃÉÉ ÎÅ IPC ÓÔÒÕËÔÕÒ. ëÌÀÞ ÓÏÚÄÁ£ÔÓÑ ÆÕÎËÃÉÅÊ ftok(3).

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) É ÆÌÁÇÏÍ, ÕÓÔÁÎÁ×ÌÉ×ÁÀÝÉÍ ÒÅÖÉÍ ÏÖÉÄÁÎÉÑ; ÐÕÓÔØ ÐÏËÁ ÏÎ ÂÕÄÅÔ ÎÕÌ£Í. ïÐÅÒÁÃÉÉ, ËÏÔÏÒÙÅ ÍÙ ÍÏÖÅÍ ÕËÁÚÁÔØ, Ñ×ÌÑÀÔÓÑ ÃÅÌÙÍÉ ÞÉÓÌÁÍÉ É ÐÏÄÞÉÎÑÀÔÓÑ ÓÌÅÄÕÀÝÉÍ ÐÒÁ×ÉÌÁÍ:
  1. sem_op < 0
    åÓÌÉ ÍÏÄÕÌØ ÚÎÁÞÅÎÉÑ × ÓÅÍÁÆÏÒÅ ÂÏÌØÛÅ ÉÌÉ ÒÁ×ÅÎ ÍÏÄÕÌÀ sem_op, ÔÏ sem_op ÄÏÂÁ×ÌÑÅÔÓÑ Ë ÚÎÁÞÅÎÉÀ × ÓÅÍÁÆÏÒÅ (Ô.Å. ÚÎÁÞÅÎÉÅ × ÓÅÍÁÆÏÒÅ ÕÍÅÎØÛÁÅÔÓÑ). åÓÌÉ ÍÏÄÕÌØ sem_op ÂÏÌØÛÅ, ÔÏ ÐÒÏÃÅÓÓ ÐÅÒÅÈÏÄÉÔ × ÓÐÑÝÉÊ ÒÅÖÉÍ, ÐÏËÁ ÎÅ ÂÕÄÅÔ ÄÏÓÔÁÔÏÞÎÏ ÒÅÓÕÒÓÏ×.
  2. sem_op = 0
    ðÒÏÃÅÓÓ ÓÐÉÔ ÐÏËÁ ÚÎÁÞÅÎÉÅ × ÓÅÍÁÆÏÒÅ ÎÅ ÄÏÓÔÉÇÎÅÔ ÎÕÌÑ.
  3. sem_op > 0
    úÎÁÞÅÎÉÅ sem_op ÄÏÂÁ×ÌÑÅÔÓÑ Ë ÚÎÁÞÅÎÉÀ × ÓÅÍÁÆÏÒÅ, ÉÓÐÏÌØÚÕÅÍÙÊ ÒÅÓÕÒÓ ÏÓ×ÏÂÏÖÄÁÅÔÓÑ.
óÌÅÄÕÀÝÁÑ ÐÒÏÇÒÁÍÍÁ ÐÒÅÄÓÔÁ×ÌÑÅÔ ÐÒÉÍÅÒ ÉÓÐÏÌØÚÏ×ÁÎÉÑ ÓÅÍÁÆÏÒÏ×, ÒÅÁÌÉÚÕÑ ÐÒÅÄÙÄÕÝÉÊ ÐÒÉÍÅÒ Ó ÂÕÆÅÒÏÍ: ÍÙ ÓÏÚÄÁÄÉÍ ÐÑÔØ ÐÒÏÃÅÓÓÏ× W É ÏÄÉÎ ÐÒÏÃÅÓÓ R. ðÒÏÃÅÓÓÙ W ÂÕÄÕÔ ÐÙÔÁÔØÓÑ ÐÏÌÕÞÉÔØ ÄÏÓÔÕÐ Ë ÒÅÓÕÒÓÕ (ÂÕÆÅÒÕ), ÚÁËÒÙ×ÁÑ ÅÇÏ ÞÅÒÅÚ ÓÅÍÁÆÏÒ, É, ÅÓÌÉ ÂÕÆÅÒ ÎÅ ÐÏÌÏÎ, ÂÕÄÕÔ ËÌÁÓÔØ × ÎÅÇÏ ÜÌÅÍÅÎÔ É ÏÓ×ÏÂÏÖÄÁÔØ ÒÅÓÕÒÓ. ðÒÏÃÅÓÓ R ÂÕÄÅÔ ÚÁËÒÙ×ÁÔØ ÒÅÓÕÒÓ, ÂÒÁÔØ ÉÚ ÎÅÇÏ ÜÌÅÍÅÎÔ, ÅÓÌÉ ÂÕÆÅÒ ÎÅ ÐÕÓÔ, É ÒÁÚÂÌÏËÉÒÏ×ÁÔØ ÒÅÓÕÒÓ.

þÔÅÎÉÅ É ÚÁÐÉÓØ × ÂÕÆÅÒ ÎÁ ÓÁÍÏÍ ÄÅÌÅ ÎÅÎÁÓÔÏÑÝÉÅ: ÔÁË ÐÒÏÉÓÈÏÄÉÔ ÐÏÔÏÍÕ, ÞÔÏ, ËÁË ÏÂÓÕÖÄÁÌÏÓØ × ÐÒÅÄÙÄÕÝÅÊ ÓÔÁÔØÅ, ËÁÖÄÙÊ ÐÒÏÃÅÓÓ ×ÙÐÏÌÎÑÅÔÓÑ × Ó×Ï£Í ÓÏÂÓÔ×ÅÎÎÏÊ ÏÂÌÁÓÔÉ ÐÁÍÑÔÉ É ÎÅ ÍÏÖÅÔ ÏÂÒÁÝÁÔØÓÑ Ë ÐÁÍÑÔÉ ÄÒÕÇÏÇÏ ÐÒÏÃÅÓÓÁ. üÔÏ ÄÅÌÁÅÔ ÎÁÓÔÏÑÝÅÅ ÕÐÒÁ×ÌÅÎÉÅ ÂÕÆÅÒÏÍ ÛÅÓÔØÀ ÐÒÏÃÅÓÓÁÍÉ ÎÅ×ÏÚÍÏÖÎÙÍ, ÔÁË ËÁË ËÁÖÄÙÊ ÐÒÏÃÅÓÓ ÂÕÄÅÔ ×ÉÄÅÔØ Ó×ÏÀ ËÏÐÉÀ ÂÕÆÅÒÁ. ×Ó£ ×ÓÔÁÎÅÔ ÎÁ Ó×ÏÉ ÍÅÓÔÁ, ËÏÇÄÁ ÍÙ ÂÕÄÅÍ ÇÏ×ÏÒÉÔØ Ï ÒÁÚÄÅÌÑÅÍÏÊ ÐÁÍÑÔÉ, ÎÏ ÄÁ×ÁÊÔÅ ÂÙÔØ ÐÏÓÌÅÄÏ×ÁÔÅÌØÎÙÍÉ.

ðÏÞÅÍÕ ÎÁÍ ÎÕÖÎÏ ÔÒÉ ÓÅÍÁÆÏÒÁ? ðÅÒ×ÙÊ (Ó ÎÏÍÅÒÏÍ 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 ÁÄÒÅÓÏÍ, ÂÕÄÕ ÒÁÄ ÐÒÏÞÉÔÁÔØ. õÄÁÞÉ!  

òÅËÏÍÅÎÄÕÅÍÁÑ ÌÉÔÅÒÁÔÕÒÁ

 

óÔÒÁÎÉÃÁ ÏÔÚÙ×Ï×

õ ËÁÖÄÏÊ ÚÁÍÅÔËÉ ÅÓÔØ ÓÔÒÁÎÉÃÁ ÏÔÚÙ×Ï×. îÁ ÜÔÏÊ ÓÔÒÁÎÉÃÅ ×Ù ÍÏÖÅÔÅ ÏÓÔÁ×ÉÔØ Ó×ÏÊ ËÏÍÍÅÎÔÁÒÉÊ ÉÌÉ ÐÒÏÓÍÏÔÒÅÔØ ËÏÍÍÅÎÔÁÒÉÉ ÄÒÕÇÉÈ ÞÉÔÁÔÅÌÅÊ :
 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: Dmitry Martsynkevitch <ursa(at)zaba.ru>

2003-02-06, generated by lfparser version 2.31