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

多个独立的进程使用信号量??

    来源: 互联网  发布时间:2015-08-28

    本文导语:  我现在想让多个独立的进程使用信号量同步! 程序是这样 服务器: #include  #include  #include  #include  #include  union semun {   int val;                      /* value for SETVAL */   struct semid_ds *buf;      ...

我现在想让多个独立的进程使用信号量同步!
程序是这样
服务器:
#include 
#include 
#include 
#include 
#include 
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 */
  void *__pad;
};
int sem_creat(key_t key);
void del_sem(int semid);
int p(int semid);
int v(int semid);

int main()
{
union semun sem;
 sem.val = 0;
  int i=10;
  key_t ky=ftok("/var/tmp",7);

  int semid=sem_creat(ky);
  printf("p:the semid is %dn",semid);
  p(semid);
  printf("the sem value is %dn", semctl(semid,0,GETVAL,sem));
  printf("p:ready to forkn");
  
  pid_t pid=fork();
  if (pid==0)
    {  
     execl("/var/tmp/sem","sem",NULL);
    }
  else 
  {
   sleep(50);
  } }
int sem_creat(key_t key)
{
 union semun sem;
 int semid;
 sem.val = 0;
 semid = semget(key,1,IPC_EXCL);
 if (-1 == semid){
  printf("create semaphore errorn");
  exit(-1);
 }
 semctl(semid,0,SETVAL,sem);
 return semid;
}
void del_sem(int semid)
{
 union semun sem;
 sem.val = 0;
 semctl(semid,0,IPC_RMID,sem);
}
//p
int p(int semid)
{union semun sem;
 sem.val = 0;
 struct sembuf sops={0,+1,0};
 return (semop(semid,&sops,1));
 }
//v
int v(int semid)
{union semun sem;
 sem.val = 0;
 struct sembuf sops={0,-1,0};
 return (semop(semid,&sops,1));
 }

///////
客户进程:sem
#include 
#include 
#include 
#include 
#include 
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 */
  void *__pad;
};
int sem_creat(key_t key);
void del_sem(int semid);
int p(int semid);
int v(int semid);

int main()
{
union semun sem;
 sem.val = 0;
  int i=10;
  key_t ky=ftok("/var/tmp",7);
 
  int semid=sem_creat(ky);
  printf("EXEC:the semid is %dn",semid);
   printf("EXEC:the sem value is %dn", semctl(semid,0,GETVAL,sem));
  v(semid);
  printf("EXEC:this is a childn");
  sleep(3);
  p(semid);
}
int sem_creat(key_t key)
{
 union semun sem;
 int semid;
 sem.val = 0;
 semid = semget(key,1,IPC_EXCL);
 if (-1 == semid){
  printf("create semaphore errorn");
  exit(-1);
 }
 semctl(semid,0,SETVAL,sem);

 return semid;
}
但是sem进程会一直等待,因为信号量是0,但是我在服务器给它加1了啊!!???
还有为什么包含头文件sem.h还是会报错说 union semun不知道存储空间!!
请大家指教,或是指导一下看什么书??





|
use "semctl(semid, 0, SETVAL, arg)" to initialize the semaphore in server.

|
要自己定义semun的结构,你可以参考semctl的man手册
#if defined(__GNU_LIBRARY__) && !defined(_SEM_SEMUN_UNDEFINED)
       /* union semun is defined by including  */
       #else
       /* according to X/OPEN we have to define it ourselves */
       union semun {
             int val;                  /* value for SETVAL */
             struct semid_ds *buf;     /* buffer for IPC_STAT, IPC_SET */
             unsigned short *array;    /* array for GETALL, SETALL */
                                       /* Linux specific part: */
             struct seminfo *__buf;    /* buffer for IPC_INFO */
       };
       #endif
欢迎访问我的个人网站 www.linuxc.net

|
semaphore 只是线程共享吧.

    
 
 

您可能感兴趣的文章:

  • 多个进程共用一个信号量,如果某个进程死掉,此时又将信号量锁定,其它进程就死掉,有什么办法可以解决这一问题
  • 不使用semget等信号量相关的函数如何实现多个进程对同一个文件的访问
  • 怎么启动一个进程会在进程列表中显示出多个同名进程?
  • 请教如何编程实现父进程产生多个子进程
  • php开源软件 iis7站长之家
  • 多个同名进程的问题--急解决
  • 请教POSIX问题:一个进程中,可以有多个互斥锁麽?
  • 诸如httpd那样的服务,一次开多个进程,每个进程都监听同一个端口,但是一个端口怎么绑定多次呢?
  • 请问大虾们,同一串口能否被多个进程同时操作?
  • spawn-fcgi是如何做到让多个fastcgi进程监听同一端口的?
  • 怎么让多个进程共用一个socket
  • 多个进程对系统V共享内存进行读写,怎样实现对共享内存部分进行加解锁?
  • 如果有多个telnet登录,会不会有相同的进程号?
  • 问一个shell问题?怎样杀死多个进程。
  • 提问:如何控制多个进程?
  • 如何在多个进程之间共享一个磁盘文件?
  • 多个进程同时写一个管道会不会有问题???
  • 一个进程分离出多个线程后cpu时间分配问题
  • 如何在一个程序中同时启动多个进程执行不同的命令?
  • 如果父进程有多个线程,那么它的子进程也该拥有这些线程
  • 当多个进程同时进行打印输出时的问题
  • 如何等待多个子进程返回
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 大侠们求指导,电信骨干网光纤信号分流成多个千兆网信号
  • linux 只有SIGUSR1和SIGUSR2,如果有多个应用程序需要信号,怎么办?
  • UNIX中多个线程同时捕捉信号,信号由那个线程捕捉到?
  • linux 多个定时器 几乎同时到时 , 部分定时器信号 丢失的问题.
  • Uploadify 'uploadify.php'存在多个输入验证漏洞
  • 我写了个linux下的网络程序,程序在多个电脑间通信,但是我没有多个电脑,怎么调试这样的程序啊?
  • PHP 'ext/soap/php_xml.c'不完整修复存在多个任意文件泄露漏洞
  • [提问]Linux下如何把多个.a文件编译一个.so文件,或者把多个.so文件编译成一个.so文件
  • linux下grep命令实现查找多个关键字(与关系和或关系)
  • 一个物理服器一个公网IP,多个虚拟机,多个域名
  • 多jdk环境下安装多个tomcat冲突解决配置方法
  • Apache + tomact 配多个域名 对 多个目录。
  • vim管理多个文件
  • 一个LINUX的驱动程序中,能不能注册多个中断?
  • 300分!查错,解决多个生产者和多个消费者问题 高手进!分不够想法子再加!
  • 如何使一个按钮响应多个事件?过来侃侃@!!!!
  • linux系统支持多个网卡同时工作吗?
  • linux字符界面怎么同时运行多个程序?
  • apache中使用mod_gnutls模块实现多个SSL站点配置(多个HTTPS协议的虚拟主机)
  • 请问如何实现多个并行的定时器?
  • 请问如何在一个文件系统修改源码管理并使用多个卷(存储设备)
  • 用tar命令如何解压多个文件
  • linux下如何做象windows下的OnTimer一样,多个定时器用一个回调函数!!!!!!!
  • rsync客户端如何从远程计算机上传输多个文件到本地计算机?
  • 可以在一台机器上同时登录多个用户吗


  • 站内导航:


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

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

    浙ICP备11055608号-3