POSIXセマフォは、
POSIX名前なしセマフォとPOSIX名前付きセマフォ
の 2 つのタイプに分けられます。
これら 2 つのセマフォは、前に紹介したセマフォ メカニズムが古いため、古いシステムです)、しかしPOSIX の優れた設計により、それらはより魅力的になります
POSIX名前付きセマフォ
この種の名前付きセマフォの名前は、「/somename」のような文字列で構成されます。前にスラッシュがあることに注意してください。このようなセマフォは実際には特別なファイルです。正常に作成されると、特別なファイルに配置されます。仮想ファイル システム /dev/shm では
、異なるプロセスが同じ名前に同意する限り、この名前付きセマフォを通じて相互に調整できます。
POSIX名前付きセマフォを使用する一般的な手順は次のとおりです。
1.
sem_open()
を使用して
、名前付きセマフォを作成または開きます。
2.
sem_wait()とsem_post()
を使用して、
それぞれP操作とV操作を実行します。
3.
sem_close()を
使用して
閉じます。
4.
sem_unlink() を
使用して
削除し、システム リソースを解放します。
#include<stdio.h>
#include <sys/types.h>
#include <sys/shm.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <unistd.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <semaphore.h>
char * shm_init()
{
//获取KEY值
int key=ftok("./",'X');
int shm_id=shmget(key, 4096,IPC_CREAT|0666);
if(shm_id==-1)
{
perror("shmget id erorr");
exit(1);//直接结束进程
}
//映射共享内存
char *shm_map=shmat(shm_id, NULL, 0);
if(shm_map==(void *)-1)
{
perror("shm map error");
exit(1);//直接结束进程
}
return shm_map;
}
int main(int argc, char const *argv[])
{
//配置共享内存并初始化
char *shm_map=shm_init();
//初始化信号量int sem_id=sem_nameinit();
sem_t* fd_sem=sem_open("/my sem name", O_CREAT, 0644, 1); // 创建一个新的有名信号量 初始化资源为0
while (1)
{
//申请一个资源
printf("等待申请资源中!!\n");
sem_wait(fd_sem);
printf("成功申请到资源!!\n请输入消息:");
//写入信息到共享内存中
fgets(shm_map,4096,stdin);
sem_post(fd_sem);
}
return 0;
}
複数のリソース
を適用または解放できる
system-V セマフォとは異なり、 POSIX セマフォの場合は、
1回あたりの申請および解放のリソース数は1です
。
sem_wait()
を呼び出すと、
リソースが 0 の
ときにブロックが発生します。
ブロックして待機したくない場合は、代わりに sem_trywait() を使用できます。