- *旗語是一個受保護的變量。對兩個或多個進程共享的資源,它可以提供限制訪問的方法。
- Linux的旗語就是操作系統原理中的信號量,有PV操作。可以獲得和釋放旗語;
- 釋放旗語會自動喚醒下一個等待獲取旗語的進程。
- 旗語有兩種類型:
- 二進制旗語:代表單個資源
- 計數旗語:用來代表數量大於一的共享資源
- GNU/Linux中的旗語實際上是一個旗語數組。說是一個旗語,實際上代表了一個包含64個旗語的數組。
- GNU/Linux的這個特點允許同時對很多個旗語進行元操作。
- 要包含頭文件:
- <sys/types.h>,<sys/ipc.h>,<sys/sem.h>
- message queue
- semaphore array
- */
- //展示了旗語的創建,獲得,釋放,顯示/修改旗語計數值,移除旗語操作
- #include <sys/types.h>
- #include <sys/ipc.h>
- #include <sys/sem.h>
- #include <stdio.h>
- #define MY_SEM_ID 12321
- int main( )
- {
- //創建一個旗語
- int semid,ret;
- semid=semget( MY_SEM_ID,1,0666|IPC_CREAT );
- //注意創建一個新的旗語,其計數值是不確定的,有的默認爲0,要想建立可移植程序
- //應該顯式的初始化旗語的計數值
- if( semid>=0 )
- printf( "Created a semphore %d\n",semid );
- //獲取當前旗語計數
- int count;
- count=semctl( semid,0,GETVAL );
- if( count!=-1 )
- printf( "Current semaphore count is %d\n",count );
- //初始化旗語的計數值
- ret=semctl( semid,0,SETVAL,1 );//把1換成>1的數就會變成計數旗語
- if( ret!=-1 )
- printf( "Initialize semaphore conut is 1\n");
- //獲得一個旗語
- int semid_acq;
- struct sembuf sb; //旗語操作結構體
- semid_acq=semget( MY_SEM_ID,1,0 );
- if( semid_acq>=0 )
- {
- sb.sem_num=0; //旗語號,因爲是二進制旗語所以用0
- sb.sem_op=-1; //把旗語數減1,但僅在旗語數的值大於0時進行,
- //如果已經爲0,則該操作及其進程會阻斷直到旗語數值增加;相當於P操作
- sb.sem_flg=0;
- printf( "Attempting to acquire semaphore %d\n",semid_acq );
- if( semop( semid_acq,&sb,1 )==-1 )
- {
- printf( "Acquired the semaphore failed %d\n",semid_acq );
- exit( -1 );
- }
- printf( "Acquired the semaphore successfully %d\n",semid_acq );
- }
- //釋放一個旗語
- printf( "Releasing semaphore %d\n",semid_acq );
- sb.sem_num=0;
- sb.sem_op=1; //旗語數加1,進行釋放,相當於V操作,注意與上面設置的對稱性
- sb.sem_flg=0;
- if( semop( semid_acq,&sb,1 )==-1)
- {
- printf( "Released semaphore failed %d\n",semid_acq );
- exit( -1 );
- }
- printf( "Released semaphore sucessfully %d\n",semid_acq );
- //移除一個旗語
- ret=semctl( semid_acq,0,IPC_RMID );
- if( ret!=-1 )
- printf( "Semaphore %d has removed\n",semid_acq );
- return 0;
- }
Linux旗語編程實例
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.