c语言编程之信号灯- 裔天工作室- JavaEye技术网站
#include <stdio.h>
#include  <sys/types.h>
#include  <sys/ipc.h>
#include  <sys/sem.h>
#include  <errno.h>
 
#define   SEMKEY 1000
main()
{
  int iSemid; 
  int ilRc;
  short ilArray[2];

  /*创建信号灯并初始化*/
  iSemid = semget(SEMKEY,1,IPC_CREAT|0600);
  if ( iSemid == -1 )
  {
    printf("创建信号灯错误semget errno:%d:%s\n",errno,strerror(errno));
    return(-1170);
  }
  ilArray[0] = 1;
  ilArray[1] = 1;
  ilRc = semctl(iSemid,1,SETALL,ilArray);
  if (ilRc==-1)
  {
    printf("信号灯初始化错误semctl SETALL errno:%d:%s\n",errno,strerror(errno));
    return(-1170); 
  }
  
  printf("start...\n");
  Lock(iSemid,1);    //锁
  sleep(20);  //等待20秒
  printf("unlock...\n");
  Unlock(iSemid,1);   //解锁
  printf("end...\n");

  /*删除信号灯*/
  ilRc = semctl(iSemid,0,IPC_RMID,0);
  if(ilRc < 0)
  {
    printf("删除信号灯出错 semctl(RM) errno:%d:%s\n",errno,strerror(errno));
    return(-1);
  }
  return(0);
}
  
int Lock(int iSemid,int iNum)
{
  struct sembuf slSembuf;
  int    ilRc;

  slSembuf.sem_num = iNum - 1;
  slSembuf.sem_op = -1;
  slSembuf.sem_flg = SEM_UNDO;

  while(1){
     ilRc = semop(iSemid,&slSembuf,1);
     if (ilRc == -1)
     {
        printf("信号灯操作出错semop P() errno:%d:%s\n",errno,strerror(errno)); 
        if(errno == EINTR) continue;
        return(-1);
     }
     return(0);
  }
}

int Unlock(int iSemid,int iNum)
{
  int ilRc;
  struct sembuf slSembuf;

  slSembuf.sem_num = iNum - 1;
  slSembuf.sem_op = 1;
  slSembuf.sem_flg = SEM_UNDO;
  ilRc = semop(iSemid,&slSembuf,1);
  if (ilRc == -1)
  {
    printf("semop P() errno:%d:%s\n",errno,strerror(errno));
    return(-1);
  }
  return(0);
}




#include <stdio.h>
#include  <sys/types.h>
#include  <sys/ipc.h>
#include  <sys/sem.h>
#include  <errno.h>
 
#define   SEMKEY 1000
main()
{
  int iSemid; 
  int ilRc;
  short ilArray[2];

  /*创建信号灯并初始化*/
  iSemid = semget(SEMKEY,1,IPC_EXCL);
  if ( iSemid == -1 )
  {
    printf("创建信号灯错误semget errno:%d:%s\n",errno,strerror(errno));
    return(-1170);
  }
  
  printf("semid=[%d]aaaaaaaaaaa\n",iSemid);
  Lock(iSemid,1);
  printf("bbbbbbbbbb \n");  //等20秒后带可以打印bbbbbbb
  Unlock(iSemid,1);

  return(0);
}
  
int Lock(int iSemid,int iNum)
{
  struct sembuf slSembuf;
  int    ilRc;

  slSembuf.sem_num = iNum - 1;
  slSembuf.sem_op = -1;
  slSembuf.sem_flg = SEM_UNDO;

  while(1){
     ilRc = semop(iSemid,&slSembuf,1);
     if (ilRc == -1)
     {
        if(errno == EINTR) continue;
        printf("信号灯操作出错semop P() errno:%d:%s\n",errno,strerror(errno)); 
        return(-1);
     }
     return(0);
  }
}

int Unlock(int iSemid,int iNum)
{
  int ilRc;
  struct sembuf slSembuf;

  slSembuf.sem_num = iNum - 1;
  slSembuf.sem_op = 1;
  slSembuf.sem_flg = SEM_UNDO;
  ilRc = semop(iSemid,&slSembuf,1);
  if (ilRc == -1)
  {
    printf("semop P() errno:%d:%s\n",errno,strerror(errno));
    return(-1);
  }
  return(0);
}


郑重声明:资讯 【c语言编程之信号灯- 裔天工作室- JavaEye技术网站】由 发布,版权归原作者及其所在单位,其原创性以及文中陈述文字和内容未经(企业库qiyeku.com)证实,请读者仅作参考,并请自行核实相关内容。若本文有侵犯到您的版权, 请你提供相关证明及申请并与我们联系(qiyeku # qq.com)或【在线投诉】,我们审核后将会尽快处理。
—— 相关资讯 ——