Linux——POSIX有名信号量
有名信号量作用:主要用于同步线程或进程头文件:#include创建或打开信号量/** 输入:const char* name 信号名 int oflag 标志(O_CREAT、O_CREAT|O_EXCL)
有名信号量
作用:主要用于同步线程或进程
头文件:#include <semaphore.h>
创建或打开信号量
/**
输入:const char* name 信号名
int oflag 标志(O_CREAT、O_CREAT|O_EXCL)
mode_t mode 访问权限
int value 初始化值
输出:sem_t* 有名信号的标识符
说明:创建并初始化一个有名信号量 或 打开一个已经创建的有名信号量
当oflag=O_CREAT 若有名信号量未创建,则创建,后面参数不能忽略必须写;
若信号量存在,则打开,后面的参数可以忽略
当oflag=O_CREAT|O_EXCL 若信号量已经存在,则输出error
*/
sem_t *sem_open(const char* name, int oflag, mode_t mode, int value);
关闭信号量的引用
/**
输入:sem_t* semid
输出:int
0——关闭成功
-1——关闭失败
说明:对有名信号量的引用进行关闭
*/
int sem_close(sem_t *semid);
删除系统中的信号量
/**
输入: const char* name 有名信号量名
输出: int
0——删除成功
-1——删除失败
说明: 删除系统中的有名信号量
*/
int sem_close(const char* name);
信号量的PV操作
/**
输入:sem_t semid 有名信号量标识符
说明: 若信号量的值为0,则此此线程或进程进入wait状态
若信号量的值为1,则信号量的值减1,然后继续运行此进程与线程
sem_wait(sem_t * semid);
/**
输入: sem_t semid 有名信号量标识符
说明: 信号量的值加1操作
sem_post(sem_t* semid);
注意:
信号量都是创建在/dev/shm下,如创建mysem,则在/dev/shm/下创建sem.mysem文件。有名信号量位于共享内存区中,那么它所保护的资源也必须位于共享内存区,
因此它可以与shmget与shmat结合使用。
简单实例:
#include <semaphore.h>
#inlcude <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <fcntl.h>
sem_t *semid;
int main(int argc, char** argv)
{
const char* semName = "sem_name_run";
semid = sem_open(semName,O_CREAT,0644,0);
if(semid == SEM_FAILED)
{
perror("unable to create semaphore");
unlink(semName);
exit(-1);
}
if(fork() == 0)
{
for(int i=0; i<10; ++i)
{
printf("childe process run: %d\n",i);
}
sem_post(semid);
}
sem_wait(semid);
for(int i=0; i<10; ++i)
{
printf("parent process run: %d\n",i);
}
sem_close(semid);
sem_unlink(semName);
return 0;
}
简单实例主要实现主进程与子进程之间实现同步功能,先阻塞主进程,当子进程运行完,在运行主进程。
更多推荐
所有评论(0)