当前位置:  技术问答>linux和unix

在linux中用C语言编程时怎么实现互斥?

    来源: 互联网  发布时间:2015-07-11

    本文导语:  我用命名管道编写程序时有多个客户端在向同一个命名管道写,我现在就是想每次只能有一个客户端写这个管道,写完以后服务端读数据,然后另外客户再写,请问怎么实现? | 用信号量实现同步 信号量...

我用命名管道编写程序时有多个客户端在向同一个命名管道写,我现在就是想每次只能有一个客户端写这个管道,写完以后服务端读数据,然后另外客户再写,请问怎么实现?

|
用信号量实现同步
信号量与已经介绍过的I P C机构(管道、F I F O以及消息列队)不同。它是一个计数器,用
于多进程对共享数据对象的存取。为了获得共享资源,进程需要执行下列操作:
(1) 测试控制该资源的信号量。
(2) 若此信号量的值为正,则进程可以使用该资源。进程将信号量值减1,表示它使用了一
个资源单位。
(3) 若此信号量的值为0,则进程进入睡眠状态,直至信号量值大于0。若进程被唤醒后,
它返回至(第( 1 )步)。
当进程不再使用由一个信息量控制的共享资源时,该信号量值增1。如果有进程正在睡眠等待
此信号量,则唤醒它们。
为了正确地实现信息量,信号量值的测试及减1操作应当是原子操作。为此,信号量通常
是在内核中实现的。
常用的信号量形式被称之为双态信号量(binary semaphore)。它控制单个资源,其初始值为1。
但是,一般而言,信号量的初值可以是任一正值,该值说明有多少个共享资源单位可供共享应用。
不幸的是,系统V的信号量与此相比要复杂得多。三种特性造成了这种并非必要的复杂性:
(1) 信号量并非是一个非负值,而必需将信号量定义为含有一个或多个信号量值的集合。
当创建一个信号量时,要指定该集合中的各个值
(2) 创建信息量(s e m g e t)与对其赋初值(s e m c t l)分开。这是一个致命的弱点,因为不能
原子地创建一个信号量集合,并且对该集合中的所有值赋初值。
(3) 即使没有进程正在使用各种形式的系统V IPC,它们仍然是存在的,所以不得不为这种
程序担心,它在终止时并没有释放已经分配给它的信号量。下面将要说明的u n d o功能就是假定
要处理这种情况的。
内核为每个信号量设置了一个s e m i d _ d s结构。
struct semid_ds {
struct ipc_perm sem_perm; /* see Section 14.6.2 */
struct sem *sem_base;/* ptr to first semaphore in set */
ushort s e m _ n s e m s ; /* #of semaphores in set */
time_t s e m _ o t i m e ; /* last-semop() time */
t i m e _ t s e m _ c t i m e ; /* last-change time */
};
对用户而言,s e m _ b a s e指针是没有价值的,它指向内核中的s e m结构数组,该数组中包含
了s e m _ n s e m s个元素,每个元素各对应于集合中的一个信号量值。
3 4 2 U N I X环境高级编程
下载
操作
S PARC,SunOS 4.1.1 8 0 3 8 6 , S V R 4
用户系统时钟用户系统时钟
消息队列0 . 8 1 0 . 7 1 1 . 6 0 . 7 1 9 . 6 2 0 . 1
流管道0 . 3 1 0 . 6 1 1 . 0 0 . 5 2 1 . 4 2 1 . 9

|
《操作系统:设计与实现 上》第二章

|
我想可以设一个全局变里吧·
不过操作系统上确实有很好的方法!去看看先!

|
那就随便找本操作系统的书,看看同步互斥,信号量之类的。

    
 
 

您可能感兴趣的文章:

  • linux进程同步或互斥
  • 在linux下,如何进行“互斥”和“并发”的控制?
  • linux/unix里的进程互斥问题 ,有关lockf()函数!
  • 请教linux irq 中断能使用mutex互斥锁吗?
  • Linux下使用C++互斥访问文件+消息队列
  • 请教如何在qt-linux环境下两个cpp文件中对同一个数组作读写互斥操作?
  • linux下临界区和互斥锁的关系
  • Linux下多线程互斥问题
  • linux下两块网卡出现互斥,如何解决,急
  • 关于Linux多线程互斥共享资源
  • linux c进程互斥
  • 求助:linux 用户态 线程同步中信号量、互斥量、锁之间的区别?
  • 新手请教一个linux下互斥量访问输出错误的问题
  • 寻求 Linux 进程互斥的方法,谢谢!
  • linux 下互斥锁问题
  • Linux c++ 消费者 生产者 互斥同步 问题
  • Linux线程管理必备:解析互斥量与条件变量的详解
  • 关于Linux中用软驱? iis7站长之家
  • LINUX下 C语言编程中 DIR 是做什么用的~?
  • 为什么要学linux环境下c语言编程
  • 新建 一 LINUX C语言编程交流群 大家若有兴趣就加入一起交流哈
  • unix/linux系统,支持那些语言编程??
  • 请问在linux中,怎样用c语言编程来实现对计算机的日期和时间的修改啊?
  • 在Linux的Eclipse中用C语言编程,求助
  • 如何用C语言编程启动linux下的shell命令
  • 请问:linux 下 C语言编程 , 如何将 串口 由 全双工 变化为 半双工 通讯 方式?
  • 在linux下,C语言编程,使用tell函数的问题
  • linux 下c 语言编程
  • linux下c语言编程问题 help !!!
  • Linux下的C语言编程
  • 请问:linux和windows下C语言编程有什么不同?(100分相送)
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 请问高手在linux中用什么命令可以做linux的启动盘???在等待高手??
  • linux中用什么方式访问设备
  • ★菜鸟问:怎么在RED HAT LINUX7.2中用169上网??
  • Linux 中用java语言写串口程序,提示找不到串口
  • 请问一般嵌入式linux中用到的摄相头是哪个型号?
  • linux中用ifconfig设置完新ip后,重启linux,ip又恢复到原来的值,怎么解决呀?
  • 如何在网络中用telnet 登陆linux系统??????
  • 在linux中用什么版本的操作系统比较好
  • 请教各位高手,在linux中用什么软件播放MP3
  • LINUX中用visualbox安装的windows,能不能使用校园网拨号上网
  • 请问在Windows系统中用什么工具可以访问硬盘中Linux分区中的文件?
  • 请问在Linux中用哪种编译器调试C++较好?
  • 在xp中用vmware安装了linux但不知怎么上网
  • 关于linux内核中用i++不用++i的疑问
  • 关于Linux中用软驱?
  • 请问!linux中用什么函数可以获取CPU的频率呢?
  • linux中用wine运行 windows程序的问题!!!
  • 弱弱的问一句,在Linux模块编程中cleanup_module中用什么语句撤销申请的内存
  • linux 中用shell编写程序时遇到的一个问题,请高手指点!!!!
  • 在哪里看我现在linux系统中用的应用软件的版本号?比如wu-ftp sendmail等等!
  • linux c/c++ IP字符串转换成可比较大小的数字
  • 在win分区上安装linux和独立分区安装linux有什么区别?可以同时安装吗?(两个linux系统)
  • linux哪个版本好?linux操作系统版本详细介绍及选择方案推荐
  • 在虚拟机上安装的linux上,能像真的linux系统一样开发linux程序么?
  • secureCRT下Linux终端汉字乱码解决方法
  • 我重装window后,把linux的引导区覆盖了,进不了linux怎么办?急啊,望热心的人帮助 (现在有linux的盘)
  • Linux c字符串中不可打印字符转换成16进制
  • 安装vmware软件,不用再安装linux系统,就可以模拟linux系统了,然后可以在其上学习一下LINUX下的基本操作 了?
  • Linux常用命令介绍:更改所属用户群组或档案属性
  • 红旗Linux主机可以通过127.0.0.1访问,但如何是连网的Win2000机器通过Linux的IP去访问Linux
  • linux命令大全详细分类介绍及常用linux命令文档手册下载


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3