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);
 }

}

posted on 2012-04-08 16:38  小风儿_xf  阅读(332)  评论(0编辑  收藏  举报

导航