1.1 创建信号量

int semget(

key_t key,   //标识信号量的关键字,有三种方法:1、使用IPC——PRIVATE让系统产生,

// 2、挑选一个随机数,3、使用ftok从文件路径名中产生

int nSemes,   //信号量集中元素个数

int flag   //IPC_CREAT;IPC_EXCL 只有在信号量集不存在时创建

)

成功:返回信号量句柄

失败:返回-1

1.2 使用ftok函数根据文件路径名产生一个关键字

key_t ftok(const char *pathname,int proj_id);

路径名称必须有相应权限

1.3 控制信号量

int semctl(

int semid,   //信号量集的句柄

int semnum,   //信号量集的元素数

int cmd,   //命令

/*union senum arg */... //

)

成功:返回相应的值

失败:返回-1

命令详细说明:

cmd: IPC_RMID 删除一个信号量

IPC_EXCL 只有在信号量集不存在时创建

IPC_SET 设置信号量的许可权

SETVAL 设置指定信号量的元素的值为 agc.val

GETVAL 获得一个指定信号量的值

GETPID 获得最后操纵此元素的最后进程ID

GETNCNT 获得等待元素变为1的进程数

GETZCNT 获得等待元素变为0的进程数

union senum 定义如下:

union senum{

int val;

struct semid_ds *buf;

unsigned short * array;

}agc;

其中 semid_ds 定义如下:

struct semid_ds{

struct ipc_pem sem_pem;   //operation pemission struct

time_t sem_otime;   //last semop()time

time_t sem_ctime;   //last time changed by semctl()

struct sem *sembase;   //ptr to first semaphore in array

struct sem_queue *sem_pending; //pending operations

struct sem_queue *sem_pending_last; //last pending operations

struct sem_undo *undo;   //undo requests on this arrary

unsigned short int sem_nsems; //number of semaphores in set

};

1.4 对信号量 +1 或 -1 或测试是否为0

int semop(

int semid,

struct sembuf *sops, //指向元素操作数组

unsigned short nsops //数组中元素操作的个数

)

结构 sembuf 定义

sembuf{

short int sem_num; //semaphore number

short int sem_op; //semaphore operaion

short int sem_flg //operation flag

};

*********************程序相关信息*********************

程序编号:014

程序编写起始日期:2008.11.2

程序编写完成日期:2008.11.2

程序修改日期:                                   修改备注:

程序目的:学习linux信号量

所用主要函数:ftok(),semget(),semop(),semctl()

程序说明:在本机上运行时,可以把程序中的“./test.c”修改成自己机器上的某个文件(要带路径)

程序完成地点: 宿舍内

*********************程序相关信息*********************/

#include

#include

#include

#include

#include

#include

#include

int main()

{

int pid,val,semid;//中者为可用资源数量,后者为信号灯(即信号量)集的识别代号

key_t semkey;

if((semkey=ftok("./test.c",1))<0)//将文件路径和项目ID(后面那个“1“)转换为System V IPC Key

{

printf("ftok函数转换出现错误。\n");

exit(1);

}

else

printf("ftok函数转换成功,key值为%d\n",semkey);

if((semid=semget(semkey,1,IPC_CREAT|IPC_EXCL|0700))<0)//创建信号灯集,其中包含1个信号灯

{

printf("semget函数创建信号灯集出现错误。\n");

exit(2);

}

else

printf("semget函数创建信号灯集成功,信号灯集识别代号semid为:%d\n",semid);

val=1;

if((semctl(semid,0,SETVAL,val))<0)//此句与上句合起来的功能是将semid对应的信号集中的第一个信号(0表示第一个信号)的可用资源数量设置为1

{

printf("semctl函数设置可用资源数量时出现错误。\n");

exit(9);

}

else

printf("semctl函数设置可用资源数量成功。\n");

if((pid=fork())<0)

{

printf("fork函数创建子进程出现错误。\n");

exit(3);

}

else if(pid>0)//父进程,先索取共享资源,而后释放

{

struct sembuf p_op_buf,v_op_buf;

printf("父进程ID为:%d,该进程将要索取共享资源\n",getpid());

p_op_buf.sem_num=0;

p_op_buf.sem_op=-1;

if(semop(semid,&p_op_buf,1)<0)//以上三行向semid代表的信号灯集的第一个信号灯申请一个资源

{

printf("父进程中,semop函数索取共享资源出现错误。\n");

exit(4);

}

else

{

int i;

printf("父进程中,semop函数索取共享资源成功,索取个数为:%d\n",abs(p_op_buf.sem_op));

printf("ID为%d的父进程现在要睡上6秒钟。\n",getpid());

for(i=6;i>0;i--)

{

printf("%d号进程(父进程)还要睡%d秒钟……\n",getpid(),i);

sleep(1);

}

printf("%d号进程(父进程)已经醒来,并将释放资源。\n",getpid());

v_op_buf.sem_num=0;

v_op_buf.sem_op=1;

p_op_buf.sem_flg=0;//该标志位此处不清零不会出现错误,但下面子进程中的该标志位应清零,因为那时父进程已经占据了资源,子进程申请不到资源的情况下,该标志位如果不清零(比如采用不赋值的默认处理),可能会出现错误。

if(semop(semid,&v_op_buf,1)<0)//以上三行将释放一个资源给semid代表的信号灯集第一个信号灯

{

printf("父进程中,semop函数索取共享资源出现错误。\n");

exit(5);

}

else

{

printf("ID号为%d的父进程中,semop函数释放共享资源成功,释放个数为:%d\n",getpid(),v_op_buf.sem_op);

sleep(1);

}

}

}

else//子进程不断申请共享资源,申请到后声明一下,然后释放

{

struct sembuf p_op_buf,v_op_buf;

sleep(2);//等待父进程将唯一的资源占用

printf("子进程ID为:%d,该进程将要索取共享资源\n",getpid());

p_op_buf.sem_num=0;

p_op_buf.sem_op=-1;

p_op_buf.sem_flg=0;//该标志位不用要清零,此处不清零将出现错误

if(semop(semid,&p_op_buf,1)<0)//向semid代表的信号灯集的第一个信号灯申请一个资源,申请不到就一直在这儿等着,什么时候有了资源,什么时候接着向下进行

{

printf("子进程中,semop函数索取共享资源出现错误:%d\n",errno);

exit(6);

}

else

printf("**********子程序已经成功申请到资源!**********\n");

v_op_buf.sem_num=0;

v_op_buf.sem_op=1;

if(semop(semid,&v_op_buf,1)<0)//以上三行将释放一个资源给semid代表的信号灯集第一个信号灯

{

printf("子进程中,semop函数索取共享资源出现错误。\n");

exit(7);

}

else

{

printf("子进程中,semop函数释放共享资源成功,释放个数为:%d\n",v_op_buf.sem_op);

printf("ID号为%d的进程(子进程)退出!\n",getpid());

if(semctl(semid,0,IPC_RMID,0)<0)

{

printf("调用semctl删除信号量集出现错误。\n");

exit(8);

}

else

{

printf("识别代号为%d的信号量集已经被删除\n",semid);

exit(0);

}

}

}

}

/*********************程序运行结果*********************

[admin@localhost temp]$ ./sem

ftok函数转换成功,key值为16802469

semget函数创建信号灯集成功,信号灯集识别代号semid为:393216

semctl函数设置可用资源数量成功。

父进程ID为:4062,该进程将要索取共享资源

父进程中,semop函数索取共享资源成功,索取个数为:1

ID为4062的父进程现在要睡上6秒钟。

4062号进程(父进程)还要睡6秒钟……

4062号进程(父进程)还要睡5秒钟……

子进程ID为:4063,该进程将要索取共享资源(但此时唯一的资源被父进程所占据,因此一直在此等待资源被释放)

4062号进程(父进程)还要睡4秒钟……

4062号进程(父进程)还要睡3秒钟……

4062号进程(父进程)还要睡2秒钟……

4062号进程(父进程)还要睡1秒钟……

4062号进程(父进程)已经醒来,并将释放资源。

ID号为4062的父进程中,semop函数释放共享资源成功,释放个数为:1

**********子程序已经成功申请到资源!**********(父进程释放资源后,刚才曾经提出申请的子进程就可以申请到资源了)

子进程中,semop函数释放共享资源成功,释放个数为:1

ID号为4063的进程(子进程)退出!

识别代号为393216的信号量集已经被删除

***********************************************************/

linux文件信号量删除,linux信号量_閑の洎茬相关推荐

  1. 过滤Linux下不同大小的文件,linux查找当前目录下 M/G 大小的文件,删除Linux下指定大小的文件

    过滤Linux下不同大小的文件,linux查找当前目录下 M/G 大小的文件,删除Linux下指定大小的文件 find ./ -type f -size +1G| xargs rm 在清理系统日志文件 ...

  2. LINUX文件已删除但磁盘空间不释放

    LINUX文件已删除但磁盘空间不释放 转自:http://www.jb51.net/LINUXjishu/224652.html 1.错误现象 运维的监控系统发来通知,报告一台服务器空间满了,登陆服务 ...

  3. linux文件权限754,Linux文件权限

    Linux文件权限 在Linux中,对系统服务的文件通常只有root才能读写或执行. 说明:Linux记录用户身份的是UID(用户ID)和GID(群组ID),root的两个ID号均为0,一般用户的两个 ...

  4. 文件上传linux服务器,Linux 文件上传Linux服务器

    进入命令行 在图形化桌面出现之前,与Unix系统进行交互的唯一方式就是借助由shell所提供的文本命令行界面(command line interface,CLI).CLI只能接受文本输入,也只能显示 ...

  5. 怎么删除linux桌面文件夹,为什么桌面上的文件夹删除不掉_桌面文件夹无法删除的解决教程...

    我们在使用电脑工作或是学习时,因为一些需要经常会创建或下载一些文档,这些文档一般都是用完就删的.但有的网友却遇到了桌面文件夹无法删除的情况,这是为什么呢?我们又该怎么来处理呢?对此今天本文就来为大家分 ...

  6. linux文件自动删除,自动删除文件脚本(Linux shell脚本)

    每天在/home/face/capturepic/2017/目录下都会产生很多文件 /home/face/capturepic/2017/4/21 /home/face/capturepic/2017 ...

  7. linux 销毁 文件,彻底删除Linux文件的方法汇总

    我们都知道Linux下如何删除系统文件,但是有时删的不彻底,要如何彻底删除文件呢?下面小编就给大家介绍下彻底删除Linux文件的方法,一起来学习下吧. linux删除目录很简单,很多人还是习惯用rmd ...

  8. 桌面存放linux文件无法删除,桌面文件无法删除怎么办【图文教程】

    我们使用电脑日常离不开就是新建以及删除,删除可以把电脑日常的垃圾清理掉,这样电脑不仅会释放一些空间,而且电脑的运行速度也会更加,但是有时候我们会发现删除的时候提示无法删除,或者找不到对象等等,很多人不 ...

  9. linux文件的删除

    linux下删除整个文件夹或者文件命令实例 1.linux删除文件夹命令 在用Linux的时候,有时候要删除一个文件夹,往往会提示次此文件非空,没法删除,这个时候,就必须使用rm -rf命令. 2.l ...

最新文章

  1. [转]计算机存储 cache介绍
  2. AI老大哥,正在看着你
  3. Quartz表达式触发
  4. 推荐系统炼丹笔记:聊一聊特征交叉新方式CAN
  5. Redis启动报错:[20000] 07 Apr 17:55:34.562 # Creating Server TCP listening socket 127.0.0.1:6379: bind: N
  6. 老年计算机音乐,老年音乐影集相机V1.2.5
  7. 静态工厂方法代替构造器实例_静态工厂方法与传统构造方法
  8. Qt笔记-QWebView完整加载页面及获取cookie
  9. jQuery学习之二---jq核心
  10. 阶段1 语言基础+高级_1-3-Java语言高级_08-JDK8新特性_第3节 两种获取Stream流的方式_2_Stream流中的常用方法_forEach...
  11. URL地址相对路径转绝对路径
  12. 什么软件可以编辑PDF文件
  13. DSP篇--C6701的COFF文件有效数据分析与提取
  14. c语言程序函数由什么两部分组成,C语言中一个函数由函数首部和_____两部分组成. 答案:函数体...
  15. 淘宝自动确认收货怎么使用Springboot+RabbitMQ实现?
  16. php收付同分账,php微信分账功能 —— app支付
  17. r7 6700g核显相当于什么显卡 锐龙r76700g性能怎么样
  18. R 回归分析 多元线性回归
  19. D3.js-基础知识
  20. python axes get_在figu中找不到Axes实例参数

热门文章

  1. 【颜色空间】RGB、HSV、Lab、YUV颜色空间模型
  2. insertBefore方法
  3. 项目中滚动字幕的设置
  4. 携程Tech Girl:做勇敢的女孩
  5. 智能家居终于起风了,三派玩家谁能收割市场?
  6. Windows电脑网线直连iperf测试
  7. ie浏览器F12查看请求挂起
  8. 从零搭建故障转移,sql server2016 AlwaysOn无域高可用性全教程
  9. 版权中心对软著手册及代码的要求
  10. ios怎么打开c语言文件夹,iOS中打开的文件如何用其他应用打开选择自己的app