System V信号灯
1:头文件myhead.h
#ifndef _MY_HEAD_
#define _MY_HEAD_
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/ipc.h>
#include<sys/sem.h>
#include<sys/wait.h>
#include<errno.h>
#include<sys/shm.h>
#include<sys/types.h>
union semun
{
int val;
struct semid_ds *buf;
unsigned short *array;
};
int sem_init(int , int);
int sem_v(int);
int sem_p(int);
int sem_del(int);
#endif
2.信号的函数sem_cmd.c
#include<stdio.h>
#include"myhead.h"
int sem_init(int semid, int init_value)//初始化
{
union semun sem_union;
sem_union.val = init_value;
semctl(semid, 0 ,SETVAL, sem_union);
printf("init\n");
return 0;
}
int sem_v(int semid)//V操作
{
struct sembuf V;
V.sem_num = 0;
V.sem_op = 1;
V.sem_flg = SEM_UNDO;
semop(semid, &V, 1);
printf("V\n");
return 0;
}
int sem_p(int semid)//P操作
{
struct sembuf P;
P.sem_num = 0;
P.sem_op = -1;
P.sem_flg = SEM_UNDO;
semop(semid, &P, 1);
printf("P\n");
return 0;
}
int sem_del(int semid)//删除
{
semctl(semid, 0, IPC_RMID, 0);
printf("del\n");
return 0;
}
3:主函数main.c
#include<stdio.h>
#include"myhead.h"
int main()
{
int semid;
pid_t pid;
semid = semget(ftok(".",'x'), 1, IPC_CREAT|0666);
sem_init(semid, 1);
pid = fork();
if(pid == 0){//child
sem_p(semid);//P操作
fprintf(stdout," child:pid %d ###############\n",getpid());
sleep(3);
fprintf(stdout," child:pid %d ###############\n",getpid());
sem_v(semid); //V操作
exit(0);
}else{//parent
sem_p(semid);//P操作
sleep(1);
fprintf(stdout," parent:pid %d ###############\n",getpid());
sem_v(semid); //V操作
wait(NULL);
sem_del(semid);
}
}