信号量相关函数原型

获得一个信号量ID

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h> int semget(key_t key, int nsems, int semflg);
返回值:成功信号量ID,出错-
key:函数ftok返回值或IPC_PRIVATE(适合用在有亲缘关系的进程中)
nsems:新的信号量集合中要创建的信号量个数,如果不是新创建的为0
semflg:  0取信号量集标识符,若不存在则函数会报错
      IPC_CREAT:当semflg&IPC_CREAT为真时,如果不存在与key值相等的信号量集,则创建。否则返回此信号量集的标识符。
      IPC_CREAT|IPC_EXCL:如果不存在与key值相等的信号量集,则创建。否则存在这样的信号集报错

对信号量的多种操作

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h> int semctl(int semid, int semnum, int cmd, ...);
除了GETALL以外的所有命令,成功0失败-1
semid:信号量标识符
semnum:信号量集数组上的下标,表示某个信号量
cmd:下面有说明
arg:semnum联合体
union semun {
int val; /* Value for SETVAL */
struct semid_ds *buf; /* Buffer for IPC_STAT, IPC_SET */
unsigned short *array; /* Array for GETALL, SETALL */
struct seminfo *__buf; /* Buffer for IPC_INFO
(Linux-specific) */
};

union semun

struct semid_ds {
struct ipc_perm sem_perm; /* Ownership and permissions */
time_t sem_otime; /* Last semop time */
time_t sem_ctime; /* Last change time */
unsigned long sem_nsems; /* No. of semaphores in set */
};

struct semid_ds

下列10种命令
IPC_STAT 对此集合取semid_ds结构,并存储在arg.buf指向的结构中
IPC_SET 设置一个信号量集合的semid_ds结构中ipc_perm域的值,并从semun的buf中取出值
IPC_RMID 从内核中删除信号量集合
GETALL 从信号量集合中获取所有信号量的值,并存到semun中的指针数组
GETNCNT 返回当前等待100%自远离用的进程个数
GETPID 返回最后执行semop的进程PID
GETVAL 返回信号量集合内单个信号量的值
GETZCNT 返回当前等待100%资源利用的进程个数
SETALL 与GETALL正好相反
SETVAL 用联合体中val成员设置信号量集合中单个信号的值

cmd指令

自动执行信号量集合上的操作数组

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h> int semop(int semid, struct sembuf *sops, size_t nsops);
返回值:成功0出错-1
semid:信号量标识符
sops:是指向结构体数组的指针
nsops:操作结构体的数量,恒大于或等于1

sembuf结构体

struct sembuf {
unsigned short sem_num; /* semaphore number */
short sem_op; /* semaphore operation */
short sem_flg; /* operation flags */
}

struct sembuf

测试代码:

 #include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h> int semid = ; union semun {
int val;
struct semid_ds *buf;
unsigned short *arry;
}; int set_semvalue()
{
union semun sem_union; sem_union.val = ;
if(semctl(semid, , SETVAL, sem_union) == -)
return -; return ;
} void del_semvalue()
{
union semun sem_union; if(semctl(semid, , IPC_RMID, sem_union) == -)
fprintf(stderr, "Failed to delete semaphore\n");
} int P()
{
struct sembuf sem_b;
sem_b.sem_num = ;
sem_b.sem_op = -;
sem_b.sem_flg = SEM_UNDO;
if(semop(semid, &sem_b, ) == -)
{
fprintf(stderr, "P() failed\n");
return -;
}
return ;
} int V()
{
struct sembuf sem_b;
sem_b.sem_num = ;
sem_b.sem_op = ;
sem_b.sem_flg = SEM_UNDO;
if(semop(semid, &sem_b, ) == -)
{
fprintf(stderr, "V() failed\n");
return -;
}
returi ;
} int main(int argc, char *argv[])
{
char msg = 'X';
int i=; if(argc > && !strcmp(argv[], ""))
{
/* first user sem */
if(set_semvalue() == -)
{
fprintf(stderr, "Failed to initialize semaphore\n");
return -;
}
msg = argv[][];
sleep();
} semid = semget((key_t), , |IPC_CREAT);
if(semid == -)
{
printf("semget error\n");
return -;
}
for(i=;i<;i++)
{
if(P() == -)
return -;
printf("%c", msg);
fflush(stdout);
sleep(rand()%);
printf("%c", msg);
fflush(stdout);
if(V() == -)
return -;
sleep(rand()%);
}
sleep();
printf("\n%d - finished\n", getpid()); if(argc > )
del_semvalue(); return ;
}

第二个竞争了例子:

 #include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h> int main(int argc, char *argv[])
{
char msg = 'X';
int i =;
if(argc >)
msg = argv[][]; for(i=;i<;i++)
{
printf("%c", msg);
fflush(stdout);
sleep(rand()%);
printf("%c", msg);
fflush(stdout);
sleep(rand()%);
}
sleep();
printf("\n%d - finished\n", getpid());
return ;
}

运行方法:

./a.out  &./a.out 

linux IPC的信号量的更多相关文章

  1. Linux IPC POSIX 信号量

    模型 #include<semaphore.h> #include<sys/stat.h> #include<fcntl.h> sem_open() //初始化并打 ...

  2. Linux IPC 之信号量

    信号量(也叫信号灯)是一种用于提供不同进程间或一个给定进程的不同线程间同步手段的原语. 信号量是进程/线程同步的一种方式,有时候我们需要保护一段代码,使它每次只能被一个执行进程/线程运行,这种工作就需 ...

  3. 【转载】Linux的进程间通信-信号量

    原文:Linux的进程间通信-信号量 Linux的进程间通信-信号量 版权声明: 本文章内容在非商业使用前提下可无需授权任意转载.发布. 转载.发布请务必注明作者和其微博.微信公众号地址,以便读者询问 ...

  4. System V IPC 之信号量

    本文继<System V IPC 之共享内存>之后接着介绍 System V IPC 的信号量编程.在开始正式的内容前让我们先概要的了解一下 Linux 中信号量的分类. 信号量的分类 在 ...

  5. Linux IPC实践(1) -- 概述

    进程的同步与互斥 进程同步: 多个进程需要相互配合共同完成一项任务. 进程互斥: 由于各进程要求共享资源,而且有些资源需要互斥使用,因此各进程间竞争使用这些资源,进程的这种关系为进程的互斥;系统中某些 ...

  6. linux ipc/its

    linux进程间双向消息队列 server.c #include <stdio.h> #include <stdlib.h> #include <string.h> ...

  7. Linux多线程编程-信号量

    在Linux中.信号量API有两组.一组是多进程编程中的System V IPC信号量.另外一组是我们要讨论的POSIX信号量. 这两组接口类似,但不保证互换.POSIX信号量函数都已sem_开头,并 ...

  8. Linux IPC之共享内存C 事例

    Linux IPC之共享内存 标签: linuxrandomnull工作 2011-08-25 11:52 4123人阅读 评论(0) 收藏 举报  分类: Linux(3)  读书札记(3)  版权 ...

  9. linux 下的信号量参数

    linux 下的信号量参数 转载自:http://blog.itpub.net/26110315/viewspace-718306/ 信号量是一种锁机制用于协调进程之间互斥的访问临界资源.以确保某种共 ...

随机推荐

  1. 纯js的右下角弹窗

    <html> <head> <title></title> <meta charset="UTF-8"> <scr ...

  2. Pydiction补全插件

    Pydiction不需要安装,所有没有任何依赖包问题,Pydiction主要包含三个文件. python_pydiction.vim -- Vim plugin that autocompletes ...

  3. HTTP详解教程 / HTTP 响应头信息 HTTP 响应头信息

    HTTP请求头提供了关于请求,响应或者其他的发送实体的信息. 在本章节中我们将具体来介绍HTTP响应头信息.直线电机哪家好 应答头 说明 Allow 服务器支持哪些请求方法(如GET.POST等). ...

  4. mysql里面如何用sql语句让字符串转换为数字

    sql语句将字符串转换为数字默认去掉单引号中的空格,遇到空格作为字符串截止, SELECT '123 and 1=1' +0 结果为123 MySQL里面如何用sql语句让字符串的‘123’转换为数字 ...

  5. P1476 休息中的小呆

    P1476 休息中的小呆 题目描述 当大家在考场中接受考验(折磨?)的时候,小呆正在悠闲(欠扁)地玩一个叫“最初梦想”的游戏.游戏描述的是一个叫pass的有志少年在不同的时空穿越对抗传说中的大魔王ch ...

  6. HTML5: HTML5 语义元素

    ylbtech-HTML5: HTML5 语义元素 1.返回顶部 1. HTML5 语义元素 语义= 意义 语义元素 = 有意义的元素 什么是语义元素? 一个语义元素能够清楚的描述其意义给浏览器和开发 ...

  7. CentOS7.5 yum 安装与配置MySQL5.7.24

    安装环境:CentOS7 64位 MINI版,安装MySQL5.7 1.配置YUM源 在MySQL官网中下载YUM源rpm安装包:https://dev.mysql.com/downloads/rep ...

  8. DNS域名解析服务以及Bind服务程序

    一般来讲域名比IP地址更加的有含义.也更容易记住,所以通常用户更习惯输入域名来访问网络中的资源,但是计算机主机在互联网中只能通过IP识别对方主机,那么就需要DNS域名解析服务了. DNS域名解析服务( ...

  9. Node.js、vue.js的使用

    Vue.js的使用 1.下载Node.js 2.打开cmd 3.执行命令 npm i 4.输入命令 npm run serve 5.浏览器打开  http://localhost:8080

  10. java部署:CentOS 7下Tomcat安装与配置教程(Tomcat开机启动)

    一.前言 1.本教程主要内容 Tomcat安装与基础配置 Tomcat开机启动配置 2.本教程适用范围与环境信息 适用范围 软件/工具 版本说明 CentOS CentOS 7 Tomcat Tomc ...