歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Linux進程間通信之信號量

Linux進程間通信包括管道、消息隊列、System V等等,其中System V包括三種:信號量、消息隊列、共享內存,這裡只簡單介紹信號量機制。

在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系統調用實現同步互斥控制;

 

下面我們一步步看看內核中都是怎麼實現的,內核中涉及到的關鍵數據結構與其主要的關系極其基本的操作如下圖所示:

Copyright © Linux教程網 All Rights Reserved