POSIX 命名信號量(Named Semaphores)是一種同步機制,用於多個進程之間的協調和資源共享。它們是 POSIX 標準的一部分,提供了一種在不同進程之間共享的信號量。
命名:
跨進程:
基本操作:
sem_open
函數創建一個命名信號量。sem_wait
函數來減少信號量的計數,並在計數為零時阻塞進程。sem_post
函數來增加信號量的計數,釋放等待的進程。sem_close
函數關閉信號量,釋放資源。sem_unlink
函數來從系統中移除命名信號量。以下是一個簡單的命名信號量的使用範例:
posix-named-sem.c
/**
* Example illustrating POSIX named semaphores
*
* Compilation (on OS X):
*
* gcc -lpthread posix-named-sem.c
*
* This example includes the appropriate error checking
* that is not covered in the text.
*
* This program illustrates POSIX named semaphores which
* work on OS X systems.
*
* Operating System Concepts - Ninth Edition
* John Wiley & Sons - 2013.
*/
#include <unistd.h>
#include <sys/types.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <string.h>
#include <semaphore.h>
#include <fcntl.h>
int main(void)
{
sem_t *sem;
/**
* Create a named semaphore called 'OSC'
*/
// first remove the semaphore if it already exists
if (sem_unlink("OSC") == -1)
printf("Error removing %s\n",strerror(errno));
// create and initialize the semaphore
if ( (sem = sem_open("OSC", O_CREAT, 0666, 1)) == SEM_FAILED)
printf("Error creating %s\n",strerror(errno));
if (sem_wait(sem) != 0)
printf("Error waiting %s\n",strerror(errno));
printf("*** Critical Section *** \n");
if (sem_post(sem) != 0)
printf("Error posting %s\n",strerror(errno));
printf("*** Non-Critical Section *** \n");
return 0;
}
POSIX 命名信號量是一種強大的工具,使得多進程的同步和資源管理變得更加簡單和高效。它們在需要進程間協作的應用中非常有用。
Terminal
編譯並執行
gcc -lpthread posix-named-sem.c
./a.out
結果:
兩次執行結果不同的原因主要是因為信號量的狀態和競爭條件。在第一次執行程式時,信號量 "OSC" 尚不存在,因此在嘗試移除它時會出現錯誤(Error removing No such file or directory)。然後,程式成功創建了信號量,進入臨界區並執行了相應的操作。
在第二次執行程式時,信號量已經存在,因此在嘗試移除它時會成功,然後程式會再次創建信號量。這樣,信號量的初始狀態會影響到 sem_wait
和 sem_post
的行為。
參考:文字參考AI,程式部分 greggagne/OSC9e/ch5/posix-named-sem.c