进程间同步 信号量

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值