system v 共享内存 + 匿名信号量 , 实现进程互斥

#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <semaphore.h>
 
int  fun(sem_t **mm, int *id)
{           
    int  shm_id,i;
	key_t  key; 
    char   temp;
    sem_t  *p_map; 
    char* name = "/dev/shm/pulse-shm-309013537";
						              
	key = ftok("/home/luguangxu/mm/sharememory/write_m.c",1);
    if( key == -1 )
	{
        perror("ftok error"); 
		return -1;
	}
								 
    shm_id=shmget(key, 1024, IPC_CREAT|S_IRUSR|S_IWUSR );
    if(shm_id==-1)
    { 
        perror("shmget error"); 
	    return -1; 
    } 
										    
    *mm =(sem_t *)shmat(shm_id, NULL, 0);
	if( NULL != id )
	    *id = shm_id;
	return 0;
}

int main()
{
	sem_t *mm,*nn;
	pid_t fd;
	int ret;
         int id;
	ret = fun(&mm,&id);
	if( 0 != ret )
		return -1;
	
	ret = sem_init(mm, 1, 1);
         if( 0 != ret )
	{
		perror("sem_init error");
		return -1;
	}
	nn = mm+1;
	ret = sem_init(nn, 1, 0);
         if( 0 != ret )
	{
		perror("sem_init error");
		return -1;
	}
    
	if( -1 == shmdt(mm) )
	{
		perror("detach error ");
		return -1;
	}
	printf("ha  ha yes !!! \n");
	mm = nn = NULL;
	fd = fork();
	if( fd < 0 )
	{
		perror("fork error");
		return -1;
	}
	//printf("ha  ha yes !!! \n");
	if( 0 == fd )
	{
	    ret = fun(&mm, NULL);
		nn = mm+1;
		if( 0 != ret )
			return -1;
		ret = 5;
	         while( ret )
		{
			sem_wait(mm);
			printf("11111111 \n");
			sem_post(nn);
			//sleep(1);
			ret--;
		}
	    if( -1 == shmdt(mm) )
	    {
		    perror("detach error ");
		    return -1;
	    }
		return 0;
	}
	else
	{
	    ret = fun(&mm, NULL);
		nn = mm+1;
		if( 0 != ret )
			return -1;
		ret = 5;
	    while( ret )
		{
			sem_wait(nn);
			printf("2222222222 \n");
			sem_post(mm);
			//sleep(2);
			ret--;
		}
	}
         sem_destroy(mm);
         sem_destroy(nn);  	
	if( -1 == shmdt(mm) )
	{
		perror("detach error ");
		return -1;
	}

	ret = shmctl(id,IPC_RMID ,NULL);
	if( 0 != ret )
	{
		perror("shmctl  error ");
		return -1;
	}
    return 0;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值