ipcs 命令,可以看到当前系统上的共享资源实例

ipcrm 命令,可以删除一个共享资源实例

linux 操作信号量的函数有三个:semget, semop, semctl

semget 声明为:

       #include <sys/types.h>#include <sys/ipc.h>#include <sys/sem.h>int semget(key_t key, int nsems, int semflg);

key 是一个键值,用来标识一个全局唯一的信号量集。要通过信号量通信的进程需要使用相同的键值来获取该信号量。

nsems 表示要创建/获取的信号量集中信号量的数目。如果是创建信号量,这个值必须指定。如果是获取已经存在的信号量,可以把它设置成0.

semflg 指定一组标志。它的低端9个比特是该信号量的权限。相当于文件操作权限,类似open函数的mode参数。而且,它还可以和IPC_CREAT标志按位“或”运算来创建新的信号量集。

成功返回一个正整数,它是信号量集的标识符;失败返回-1,并设置errno

semop 系统调用改变信号量的值,即执行P、V操作:

int semop(int semid, struct sembuf *sops, size_t nsops);

semid 是由 semget 返回的信号量集标识符,用来指定被操作的目标信号量集。

sops 是 struct sembug 结构体,定义为:

/* Structure used for argument to `semop' to describe operations.  */
struct sembuf
{unsigned short int sem_num;   /* semaphore number */short int sem_op;     /* semaphore operation */short int sem_flg;        /* operation flag */
};

sem_num 是信号量集的编号,0表示第一个信号量。

sem_op 指定操作类型,可选值为正整数、0、负整数。

sem_flg 可选值是 IPC_NOWAIT, SEM_UNDO。IPC_NOWAIT指,无论信号量集操作是否成功,semop调用都立刻返回。SEM_UNDO含义是,当进程退出时,取消正在进行的semop操作

nsops参数指定要执行的操作个数,即sops数组中元素的个数。semop对数组sops中的每个元素按照数组顺序依次执行操作,并且这个过程是原子操作。

semop成功返回0,失败返回-1并设置errno。失败的时候,sops数组中指定的所有操作都不执行。

semctl用来对信号量进行直接操作:

int semctl(int semid, int semnum, int cmd, ...);

semid 是semget调用返回的信号量集标识符。semnum指定被操作的信号量在信号量集中的编号。cmd指定要执行的命令。有的命令需要传入第4个参数,这个参数类型由用户定义,但是,内核给出了它的格式,而且,必须是这个格式:

           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) */};

cmd 的值比较多,不列举了,可以看manpage,其中,

IPC_STAT 将信号量集关联的内核数据结构复制到semun.buf中,

GETVAL 获取信号量的semval的值

SETVAL 将信号量的semval值设置为semun.val

IPC_RMID 立即移除信号量集,唤醒所有等待信号量集的进程

该函数返回值根据cmd不同而不同。失败返回-1,并设置errno

semget函数第一个参数key可以设置为 IPC_PRIVATE(值为0),这样,无论信号量是否存在,都会创建一个新的信号量

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/sem.h>//这个联合体需要手动定义
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) */
};void ErrExit(const char* reason)
{fprintf(stderr, "%s: %d, %s\n", reason, errno, strerror(errno));exit(1);
}int initsem(int key = 0)
{int semid = -1;if (-1 == (semid = semget(key, 1, 0666 | IPC_CREAT))){ErrExit("semget");}// 信号量初始值为1
    union semun sem_un;sem_un.val = 1;if (-1 == semctl(semid, 0, SETVAL, sem_un)){ErrExit("semctl");}return semid;
}void destroysem(int semid)
{if (-1 == semctl(semid, 0, IPC_RMID)){ErrExit("semctl del");}
}// -1 为 p 操作
void P(int semid)
{struct sembuf op;op.sem_num = 0;op.sem_op = -1;op.sem_flg = SEM_UNDO;if (-1 == semop(semid, &op, 1)){ErrExit("semop p");}
}// 1 为 v 操作
void V(int semid)
{struct sembuf op;op.sem_num = 0;op.sem_op = 1;op.sem_flg = SEM_UNDO;if (-1 == semop(semid, &op, 1)){ErrExit("semop v");}
}int main(int argc, char const *argv[])
{int semid = initsem();pid_t pid = fork();if (pid > 0){P(semid);printf("in parent process...\n");sleep(1);V(semid);waitpid(pid, NULL, 0);// 删除信号量集
        destroysem(semid);}else if (0 == pid){P(semid);printf("in child process...\n");sleep(1);V(semid);}else{ErrExit("fork");}return 0;
}

转载于:https://www.cnblogs.com/zuofaqi/p/9643787.html

linux ipc信号量相关推荐

  1. Linux IPC进程间通信(三):信号量

    系列文章: Linux IPC进程间通信(一):管道 Linux IPC进程间通信(二):共享内存 Linux IPC进程间通信(三):信号量 Linux IPC进程间通信(四):消息队列 文章目录 ...

  2. linux c 信号量简介

    信号量的分类 在学习 IPC 信号量之前,让我们先来了解一下 Linux 提供两类信号量: 内核信号量,由内核控制路径使用. 用户态进程使用的信号量,这种信号量又分为 POSIX 信号量和 Syste ...

  3. Unix/Linux IPC及线程间通信总结

    一.互斥与同步 1.互斥:是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性.但互斥无法限制访问者对资源的访问顺序,即访问是无序的. 2.同步:是指在互斥的基础上(大多数情况),通过其它 ...

  4. Linux 进程间通信 - 信号量

    0. 前言    进程是一个独立的资源管理单元,不同进程间的资源是独立的,不能在一个进程中访问另一个进程的用户空间和内存空间.但是,进程不是孤立的,不同进程之间需要信息的交互和状态的传递,因此需要进程 ...

  5. Linux IPC总结(全)

    原文链接 IPC进程间通信(Inter-Process Communication)就是指多个进程之间相互通信,交换信息的方法.Linux IPC基本上都是从Unix平台上继承而来的.主要包括最初的U ...

  6. Linux IPC shm

    Linux IPC Shm Linux 共享内存 Linux 不同进程之间可以通过共享内存的方式完成通信. Linux 使用共享内存 共享内存相关API shmget shmget - allocat ...

  7. Linux系统信号量实现生产者-消费者问题

    Linux系统信号量实现生产者-消费者问题 实现代码 #include<bits/stdc++.h> #include<unistd.h> #include<pthrea ...

  8. Linux操作系统-信号量

    信号量也属于一种进程间通信的机制,与其他的进程间通信不同,信号量不是用来传输数据的,而是用来进程间同步与互斥.除此之外,信号量还可以实现线程间的互斥. 信号量是什么? 信号量的本质是一个计数器. 一个 ...

  9. Linux IPC实践(11) --System V信号量(1)

    信号量API #include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h> int semget ...

  10. Linux IPC 3 之 信号量

    一 什么是信号量 二 信号量的分类 三 内核信号量 1 内核信号量的构成 2 内核信号量中的等待队列删除没有联系 3 内核信号量的相关函数 1 初始化 2 申请内核信号量所保护的资源 3 释放内核信号 ...

最新文章

  1. 最近公共祖先 LCA Tarjan算法
  2. BZOJ5102 POI2018Prawnicy(堆)
  3. LSTM 和 GRU
  4. panda python_12个很棒的Pandas和NumPy函数,让分析事半功倍
  5. EF CodeFirst下的自动迁移
  6. Session重点整理
  7. 96% 移动恶意软件针对 Android 系统:逾50亿应用可被攻击
  8. 华为怎么删除自带的音乐_华为手机独有的这个模式,让睡觉更舒畅
  9. 阿里巴巴JAVA开发手册----(二)异常日志
  10. arm架构安装rxtx_Ubuntu下安装和配置RXTX实现串口通讯
  11. 阿里巴巴大数据实践:大数据建设方法论OneData
  12. 通过关键词获取微博内容
  13. transformer 模型的decoder部分 带gif动图
  14. 测试用例设计-淘宝购物车,微信发红包
  15. matlab求三维图形表面积,基于MATLAB的不规则平面立体表面积计算
  16. 华为模拟器eNSP练习题-静态路由、缺省路由
  17. PS如何给白衬衫换色
  18. js输入框的联想功能
  19. 龟兔赛跑c语言程序设计题,模拟龟兔赛跑(很笨拙的代码)
  20. 解决phpstorm编辑html卡顿问题

热门文章

  1. smale学习之数学表达式(day5)
  2. 一个react项目案例01 组件部分
  3. mysql能将查询结果与表左查询,MySQL查询与结构
  4. 浙江省单考单招计算机提前招,2018浙江省各校高职提前招生简章汇总及深度解析...
  5. docker镜像打包
  6. python+grpc+yolo 目标检测实践
  7. Sublime Text SFTP 注册码
  8. 2021-06-23元素的排列,浮动和display
  9. java进账和转账需要锁吗,Spring与Java中的锁
  10. 机器学习 什么是Cross Entropy 交叉熵