Linux旗語編程實例

  1. *旗語是一個受保護的變量。對兩個或多個進程共享的資源,它可以提供限制訪問的方法。  
  2.   Linux的旗語就是操作系統原理中的信號量,有PV操作。可以獲得和釋放旗語;  
  3.   釋放旗語會自動喚醒下一個等待獲取旗語的進程。  
  4.   旗語有兩種類型:  
  5.   二進制旗語:代表單個資源  
  6.   計數旗語:用來代表數量大於一的共享資源  
  7.   GNU/Linux中的旗語實際上是一個旗語數組。說是一個旗語,實際上代表了一個包含64個旗語的數組。  
  8.   GNU/Linux的這個特點允許同時對很多個旗語進行元操作。  
  9.   要包含頭文件:  
  10.   <sys/types.h>,<sys/ipc.h>,<sys/sem.h>  
  11.   message queue  
  12.   semaphore array  
  13.   */  
  14. //展示了旗語的創建,獲得,釋放,顯示/修改旗語計數值,移除旗語操作   
  15. #include <sys/types.h>   
  16. #include <sys/ipc.h>   
  17. #include <sys/sem.h>   
  18. #include <stdio.h>   
  19. #define MY_SEM_ID 12321   
  20. int main(  )   
  21.     {   
  22.         //創建一個旗語   
  23.         int semid,ret;   
  24.         semid=semget( MY_SEM_ID,1,0666|IPC_CREAT );   
  25.         //注意創建一個新的旗語,其計數值是不確定的,有的默認爲0,要想建立可移植程序   
  26.         //應該顯式的初始化旗語的計數值   
  27.         if( semid>=0 )   
  28.             printf( "Created a semphore %d\n",semid );   
  29.         //獲取當前旗語計數   
  30.         int count;   
  31.         count=semctl( semid,0,GETVAL );   
  32.         if( count!=-1 )   
  33.             printf( "Current semaphore count is %d\n",count );   
  34.         //初始化旗語的計數值   
  35.         ret=semctl( semid,0,SETVAL,1 );//把1換成>1的數就會變成計數旗語   
  36.         if( ret!=-1 )   
  37.             printf( "Initialize semaphore conut is 1\n");   
  38.            
  39.         //獲得一個旗語   
  40.         int semid_acq;   
  41.         struct sembuf sb; //旗語操作結構體   
  42.            
  43.         semid_acq=semget( MY_SEM_ID,1,0 );   
  44.         if( semid_acq>=0 )   
  45.             {   
  46.                 sb.sem_num=0; //旗語號,因爲是二進制旗語所以用0   
  47.                 sb.sem_op=-1; //把旗語數減1,但僅在旗語數的值大於0時進行,   
  48.                               //如果已經爲0,則該操作及其進程會阻斷直到旗語數值增加;相當於P操作   
  49.                 sb.sem_flg=0;   
  50.                 printf( "Attempting to acquire semaphore %d\n",semid_acq );   
  51.                 if( semop( semid_acq,&sb,1 )==-1 )   
  52.                 {   
  53.                     printf( "Acquired the semaphore failed %d\n",semid_acq );   
  54.                     exit( -1 );   
  55.                 }   
  56.                 printf( "Acquired the semaphore successfully %d\n",semid_acq );   
  57.             }   
  58.         //釋放一個旗語   
  59.         printf( "Releasing semaphore %d\n",semid_acq );   
  60.         sb.sem_num=0;   
  61.         sb.sem_op=1;   //旗語數加1,進行釋放,相當於V操作,注意與上面設置的對稱性   
  62.         sb.sem_flg=0;   
  63.         if( semop( semid_acq,&sb,1 )==-1)   
  64.            {   
  65.             printf( "Released semaphore failed %d\n",semid_acq );   
  66.             exit( -1 );   
  67.            }   
  68.         printf( "Released semaphore sucessfully %d\n",semid_acq );   
  69.         //移除一個旗語   
  70.         ret=semctl( semid_acq,0,IPC_RMID );   
  71.         if( ret!=-1 )   
  72.             printf( "Semaphore %d has removed\n",semid_acq );   
  73.            
  74.         return 0;   
  75.            
  76.     }  



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章