以下實例通過信號量實現對臨界資源的同步訪問問題。server程序創建一個信號集,並對信號量循環減1,相當於分配資源。而client在執行時首先檢查信號量,如果大於0代表有資源可用,就繼續執行。如果信號量小於0代表資源已經分配完畢,進程client退出。
server.c
//server.c
#include <sys/types.h>
#include <linux/sem.h>
#define MAX_RESOURCE 5
int main(void)
{
key_t key;
int semid;
struct sembuf sbuf = {0, -1, IPC_NOWAIT};
union semun semopts;
if ((key = ftok(".", 's')) == -1)
{
perror ("ftok error!\n");
exit (1);
}
if ((semid = semget (key,1,IPC_CREAT|0666)) == -1)
{
perror ("semget error!\n");
exit (1);
}
semopts.val = MAX_RESOURCE;
if (semctl (semid,0,SETVAL, semopts) == -1)
{
perror ("semctl error!\n");
exit (1);
}
while (1)
{
if(semop(semid, &sbuf, 1) == -1)
{
perror ("semop error!\n");
exit (1);
}
sleep (3);
}
exit (0);
}
//client.c
#include <sys/types.h>
#include <linux/sem.h>
int main(void)
{
key_t key;
int semid, semval;
union semun semopts;
if((key = ftok (".",'s')) == -1)
{
perror ("ftok error!\n");
exit (1);
}
if((semid = semget (key, 1, IPC_CREAT | 0666)) == -1)
{
perror ("semget error!\n");
exit (1);
}
while(1)
{
if ((semval = semctl(semid, 0, GETVAL, 0)) == -1)
{
perror ("semctl error!\n");
exit (1);
}
if (semval > 0)
{
printf ("Still %d resources can be used\n", semval);
}
else
{
printf ("No more resources can be used!\n");
break;
}
sleep (3);
}
exit (0);
}
打開兩個shell終端,分別執行server和client兩個程序。以下是2個程序的執行結果。
server執行情況:
client執行情況: