#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/sem.h>
#include "semun.h"
?
static int sem_id;
static int set_semvalue()
{
????union semun sem_union;
????sem_union.val = 1;
????if (semctl(sem_id,0,SETVAL,sem_union) == -1)
????????return 0;
????return 1;
}
static void del_semvalue()
{
????union semun sem_union;
????if (semctl(sem_id,sem_union) == -1)
????????fprintf(stderr,"Fail to delete semaphoren");
}
static int sema_p()
{
????struct sembuf sem_b;
????sem_b.sem_num = 0;//信号量编号,除非是一组信号量,否则0
????sem_b.sem_op = -1;//-1操作
????sem_b.sem_flg = SEM_UNDO;//与操作系统对信号量的操作相关,一般是UNDO
????if (semop(sem_id,&sem_b,1) == -1)
????{
????????fprintf(stderr,"sema_p failedn");
????????return 0;
????}
????return 1;
}
static int sema_v()
{
????struct sembuf sem_b;
????sem_b.sem_num = 0;
????sem_b.sem_op = 1;
????sem_b.sem_flg = SEM_UNDO;
????if (semop(sem_id,"sema_v failedn");
????????return 0;
????}
????return 1;
}
?
int main(int argc,char *argv[])
{
????int i;
????int pause_time;
????char op_char = ‘O‘;
????srand((unsigned int)getpid());
????sem_id = semget((key_t)1234,1,0666 | IPC_CREAT);
????if (argc > 1)
????{
????????if(set_semvalue() == 0)
????????{
????????????fprintf(stderr,"init failn");
????????????exit(EXIT_FAILURE);
????????}
????????op_char = ‘X‘;
????????sleep(2);
????}
?
????for (i = 0; i < 10; i++)
????{
????????if (sema_p() == 0)
????????????exit(EXIT_FAILURE);
????????printf("%c",op_char);
????????fflush(stdout);
?
????????pause_time = rand() % 3;
????????sleep(pause_time);
????????printf("%c",op_char);
????????fflush(stdout);
?
????????if (!sema_v())
????????????exit(EXIT_FAILURE);
????????pause_time = rand() % 2;
????????sleep(pause_time);
????}
????printf("n%d - finishedn",getpid());
????if (argc > 1)
????{
????????sleep(10);
????????del_semvalue();
????}
????exit(EXIT_SUCCESS);
}
|