iT邦幫忙

2024 iThome 鐵人賽

DAY 17
0
Software Development

十年後重讀作業系統恐龍本系列 第 17

ch5-POSIX命名信號量(Named Semaphores)

  • 分享至 

  • xImage
  •  

POSIX 命名信號量(Named Semaphores)是一種同步機制,用於多個進程之間的協調和資源共享。它們是 POSIX 標準的一部分,提供了一種在不同進程之間共享的信號量。

主要特點

  1. 命名

    • 命名信號量是通過一個名稱(字符串)來識別的,這使得不同的進程可以通過相同的名稱來訪問同一個信號量。
  2. 跨進程

    • 與匿名信號量不同,命名信號量可以在不同的進程之間共享。這使得它們特別適合於需要進程間同步的情況。
  3. 基本操作

    • 創建:使用 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

結果:
https://ithelp.ithome.com.tw/upload/images/20241001/20168766QBnAld39P5.png
兩次執行結果不同的原因主要是因為信號量的狀態和競爭條件。在第一次執行程式時,信號量 "OSC" 尚不存在,因此在嘗試移除它時會出現錯誤(Error removing No such file or directory)。然後,程式成功創建了信號量,進入臨界區並執行了相應的操作。

在第二次執行程式時,信號量已經存在,因此在嘗試移除它時會成功,然後程式會再次創建信號量。這樣,信號量的初始狀態會影響到 sem_waitsem_post 的行為。

參考:文字參考AI,程式部分 greggagne/OSC9e/ch5/posix-named-sem.c


上一篇
ch5-POSIX未命名信號量(Unnamed Semaphores)
下一篇
ch5圖5.8-Pthread排班API
系列文
十年後重讀作業系統恐龍本30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言