在Linux編程中,要運用信號量實現互斥操作,用戶空間需要調用幾個系統調用,如下是一個用戶空間例子。
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#define SEMKEY 1234L
#define PERMS 0666
struct sembuf op_down[1]={0,-1,0};
struct sembuf op_up[1]={0,1,0};
int semid=-1;
int res;
void init_sem()
{
semid=semget(SEMKEY,0,IPC_CREAT |PERMS);
if(semid<0)
{
printf("create semaphore\n");
semid=semget(SEMKEY,1,IPC_CREAT| PERMS);
if(semid<0)
{
printf("couldn't create semaphore\n");
exit(-1);
}
res=semctl(semid,0,SETVAL,1);
}
}
void down()
{
res=semop(semid,&op_down[0],1);
}
void up()
{
res=semop(semid,&op_up[0],1);
}
int main()
{
init_sem();
printf("beforecritical code\n");
down();
printf("incritical code\n");
sleep(10);
up();
return0;
}
用戶空間的程序中分為三步:
1, 調用semget系統調用創建信號量;
2, 調用semctl系統調用設置信號量初始值;
3, 調用semop系統調用實現同步互斥控制;
下面我們一步步看看內核中都是怎麼實現的,內核中涉及到的關鍵數據結構與其主要的關系極其基本的操作如下圖所示: