信號燈(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;
}