main.c
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<unistd.h>
#include<sys/sem.h>
#include<sys/ipc.h>
#include"sem.h"
#define DELAY_TIME 2
int main()
{
pid_t pid;
int sem_id;
key_t sem_key;
sem_key = ftok(".",'a');
sem_id = semget(sem_key,1,0666|IPC_CREAT); //创建iyge信号量,返回信号量IPC标识符sem_id
init_sem(sem_id,1); //将sem_id设为1
if((pid = fork()) < 0)
{
perror("Fork error!\n");
exit(1);
}
else if (pid == 0)
{
while(1)
{
sem_p(sem_id); //P操作
printf("Child running...\n");
sleep(DELAY_TIME);
printf("Child %d,returned value:%d.\n",getpid(),pid);
sem_v(sem_id); //V操作
}
}
else
{
while(1)
{
sem_p(sem_id); //P操作
printf("Parent running...\n");
sleep(DELAY_TIME);
printf("Parent %d,returned value:%d.\n",getpid(),pid);
sem_v(sem_id); //V操作
}
}
}
sem.c
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<unistd.h>
#include<sys/sem.h>
#include<sys/ipc.h>
#include"sem.h"
//将信号量sem_id设为init_value
int init_sem(int sem_id,int init_value)
{
union semun sem_union;
sem_union.val = init_value;
if(semctl(sem_id,0,SETVAL,sem_union) == -1)
{
perror("Sem init");
exit(1);
}
return 0;
}
//删除信号量
int del_sem(int sem_id)
{
union semun sem_union;
if(semctl(sem_id,0,IPC_RMID,sem_union) == -1)
{
perror("Sem delete");
exit(1);
}
return 0;
}
//对信号量进行P操作
int sem_p(int sem_id)
{
struct sembuf sem_buf;
sem_buf.sem_num = 0;
sem_buf.sem_op = -1;
sem_buf.sem_flg = SEM_UNDO;
if(semop(sem_id,&sem_buf,1) == -1)
{
perror("Sem P operation");
exit(1);
}
return 0;
}
//队信号量进行V操作
int sem_v(int sem_id)
{
struct sembuf sem_buf;
sem_buf.sem_num =0;
sem_buf.sem_op = 1;
sem_buf.sem_flg = SEM_UNDO;
if(semop(sem_id,&sem_buf,1) == -1)
{
perror("Sem V operation");
exit(1);
}
return 0;
}
sem.h
#ifndef _SEM_H_
#define _SEM_H_
union semun{
int val;
struct semid_ds *buf;
unsigned short *array;
};
int init_sem(int sem_id,int init_value);
int del_sem(int sem_id);
int sem_p(int sem_id);
int sem_v(int sem_id);
#endif