Linux semaphore POSIX信號燈的Hello World

        信號燈(semaphore)是一種用於提供不同進程間或一個給定進程的不同線程間同步手段的原語(引自Unix網絡編程第2捲進程間通信第二版)。閒話少說,直接上Hello World代碼。其中用到的信號燈函數的用法參見進程間通信一書第10章。本人的測試環境cygwin。

服務端

#include <stdlib.h> 
#include <fcntl.h> 
#include <semaphore.h> 
#include <stdio.h>
  
int main() 
{ 
    sem_t * sem; 
    int value = 0, i = 0, ret = 0;

    char * name = "/sem_server";
    sem = sem_open(name, O_CREAT, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH, 0); 
    if(sem == SEM_FAILED) { 
        printf("server] open semaphore failed\n");
        exit(-1);    
    }

    printf("server] open semphore succeeded\n");

    sem_getvalue(sem, &value);
    printf("server] sem value is %d\n", value);
      
    ret = sem_wait(sem);
    if (ret == -1) {
        printf("server] waiting sem was interrupt\n");
        sem_close(sem);
        return -1;
    }

    printf("server] all things done\n");

    sem_close(sem);
    return 0;
} 

客戶端

#include <semaphore.h> 
#include <stdlib.h> 
#include <fcntl.h> 
#include <stdio.h>

int main() 
{ 
    int value = 0, i = 0, ret = 0;
    sem_t * sem = NULL; 
    char * name = "/sem_server";  
    sem = sem_open(name, O_CREAT, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH, 0); 
    if(sem == SEM_FAILED) { 
        printf("client] open semaphore failed");
        return -1;
    }

    printf("client] open semphore succeeded\n");

    sem_getvalue(sem,&value); 
    printf("client] sem value is %d\n", value); 

    ret = sem_post(sem);
    if (ret == -1) {
        printf("client] posting sem failed.\n");
        sem_close(sem);
        return -1;
    }

    printf("client] all things done\n");

    sem_close(sem);
    return 0; 
} 


發佈了86 篇原創文章 · 獲贊 10 · 訪問量 43萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章