C语言之信号量
Semaphore1.c
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define SHMKEY 1111
#define SHMSIZE 4096
#define SEMKEY 1111
union semun
{
int val;
struct semmid_ds *buf;
unsigned short *array;
struct seminfo *_buf;
};
int sem_p(int id)
{
int ret;
struct sembuf buf;
buf.sem_num = 0;
buf.sem_op = -1;
buf.sem_flg = SEM_UNDO;
ret = semop(id,&buf,1);
if(-1 == ret)
{
perror("semop");
return 1;
}
return 0;
}
int sem_v(int id)
{
int ret;
struct sembuf buf;
buf.sem_num = 0;
buf.sem_op = 1;
buf.sem_flg = SEM_UNDO;
ret = semop(id,&buf,1);
if(-1 == ret)
{
perror("semop");
return 1;
}
return 0;
}
int main()
{
int shmid,ret,count = 0;
void *shmaddr;
int semid;
union semun union_sem;
shmid = shmget(SHMKEY,SHMSIZE,IPC_CREAT | IPC_EXCL);
if(-1 == shmid)
{
perror("shmget");
exit(1);
}
shmaddr = shmat(shmid,NULL,0);
if((void *)-1 == shmaddr)
{
perror("shmat");
exit(1);
}
semid = semget(SEMKEY,1,IPC_CREAT | IPC_EXCL);
if(-1 == semid)
{
perror("semget");
exit(1);
}
union_sem.val = 1;
ret = semctl(semid,0,SETVAL,union_sem);
if(-1 == ret)
{
perror("semctl");
exit(1);
}
*(int *)shmaddr = count;
while(1)
{
sem_p(semid);
count = *(int *)shmaddr;
if(count > 100)
{
sem_v(semid);
break;
}
usleep(100000);
printf("Process1 : count = %d\n",count);
count++;
*(int *)shmaddr = count;
sem_v(semid);
}
usleep(100000);
ret = shmdt(shmaddr);
if(-1 == ret)
{
perror("shmdt");
exit(1);
}
ret = shmctl(shmid,IPC_RMID,NULL);
if(-1 == ret)
{
perror("shmctl");
exit(1);
}
ret = semctl(semid,0,IPC_RMID);
if(-1 == ret)
{
perror("semctl");
exit(1);
}
return 0;
}
Semaphore2.c
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define SHMKEY 1111
#define SHMSIZE 4096
#define SEMKEY 1111
union semun
{
int val;
struct semmid_ds *buf;
unsigned short *array;
struct seminfo *_buf;
};
int sem_p(int id)
{
int ret;
struct sembuf buf;
buf.sem_num = 0;
buf.sem_op = -1;
buf.sem_flg = SEM_UNDO;
ret = semop(id,&buf,1);
if(-1 == ret)
{
perror("semop");
return 1;
}
return 0;
}
int sem_v(int id)
{
int ret;
struct sembuf buf;
buf.sem_num = 0;
buf.sem_op = 1;
buf.sem_flg = SEM_UNDO;
ret = semop(id,&buf,1);
if(-1 == ret)
{
perror("semop");
return 1;
}
return 0;
}
int main()
{
int shmid,ret,count = 0;
void *shmaddr;
int semid;
union semun union_sem;
shmid = shmget(SHMKEY,SHMSIZE,0);
if(-1 == shmid)
{
perror("shmget");
exit(1);
}
shmaddr = shmat(shmid,NULL,0);
if((void *)-1 == shmaddr)
{
perror("shmat");
exit(1);
}
semid = semget(SEMKEY,1,0);
if(-1 == semid)
{
perror("semget");
exit(1);
}
/*union_sem.val = 1;
ret = semctl(semid,0,SETVAL,union_sem);
if(-1 == ret)
{
perror("semctl");
exit(1);
}*/
//*(int *)shmaddr = count;
while(1)
{
sem_p(semid);
count = *(int *)shmaddr;
if(count > 101)
{
sem_v(semid);
break;
}
usleep(100000);
printf("Process2 : count = %d\n",count);
count++;
*(int *)shmaddr = count;
sem_v(semid);
}
ret = shmdt(shmaddr);
if(-1 == ret)
{
perror("shmdt");
exit(1);
}
/*ret = shmctl(shmid,IPC_RMID,NULL);
if(-1 == ret)
{
perror("shmctl");
exit(1);
}
ret = semctl(semid,0,IPC_RMID);
if(-1 == ret)
{
perror("semctl");
exit(1);
}*/
return 0;
}