c言語プログラミングのシグナルランプ



#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
",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
",errno,strerror(errno)); return(-1170); } printf("start...
"); Lock(iSemid,1); // sleep(20); // 20 printf("unlock...
"); Unlock(iSemid,1); // printf("end...
"); /* */ ilRc = semctl(iSemid,0,IPC_RMID,0); if(ilRc < 0) { printf(" semctl(RM) errno:%d:%s
",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
",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
",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
",errno,strerror(errno)); return(-1170); } printf("semid=[%d]aaaaaaaaaaa
",iSemid); Lock(iSemid,1); printf("bbbbbbbbbb
"); // 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
",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
",errno,strerror(errno)); return(-1); } return(0); }