Linux——POSIX有名信号量
2016-03-30 14:21
393 查看
有名信号量
作用:主要用于同步线程或进程头文件:#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;
}
简单实例主要实现主进程与子进程之间实现同步功能,先阻塞主进程,当子进程运行完,在运行主进程。
相关文章推荐
- linux下awk的典型用法示例
- linux下环境变量、启动脚本、进程判断设置
- Linux内核目录
- Linux启动流程
- centos 6.6下搭建lamp
- Linux文件系统破坏,导致系统无法启动解决办法
- Linux安全加固
- linux基本知识2
- centos + eclipse + maven
- linux基本知识1
- 自学鸟哥linux服务-samba文件共享服务
- 使用互斥量控制Linux线程同步
- Linux的USB-Serial 代码跟踪
- CentOS 6.4下PXE+Kickstart无人值守安装操作系统
- Linux-自动挂载文件/etc/fstab功能详解
- Linux主分区,扩展分区,逻辑分区的联系和区别
- Linux管道符
- linux硬盘挂载-新硬盘挂载和扩容硬盘挂载
- Linux C程序如何检测WIFI无线USB网卡是否可用?
- .Net程序在linux mono环境和WindowsServer上执行测试对比