Linux下进程通信之:信号量

进程通信:进程与进程间的数据交换,称为进程通信。进程通讯的方式有:共享内存、信号量、管道、消息队列、socket等等

信号量:可以被看做是一种具有原子操作的计数器,它控制多个进程对共享资源的访问,通常描述临界资源当中,临界资源的数目,常常被当做锁(lock)来使用,防止一个进程访问另外一个进程正在使用的资源。

-------------------------sem_test1.c-----------------------
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <unistd.h>

union semun
{
	int val;
	struct semid_ds *buf;
	unsigned short *array;
	struct seminfo *__buf;
};

int main(int argc, char *argv[])
{
	int sem_id;
	int pid;
	int i,v_al;
	struct sembuf sem_op;//信号量结构
	union semun sem_val; //信号量数值

	key_t sem_Key;

	//将指定文件,temp_sem.txt转换成我们所需要的key,该文件必须存在且可存取,名字和数字相同就会产生相同的key,数字必须大于0
	sem_Key = ftok("temp_sem.txt", 1);
	if(sem_Key == -1)
	{
		printf("ftok is error\n");
		return -1;
	}
	
	//建立信号量集,其中只有一个信号量,0开始,作为第一个信号量
	sem_id = semget(sem_Key,1,IPC_CREAT|0777);
	if(sem_id == -1)
	{
		printf("sem_id is error\n");
		return -1;
	}

	sem_val.val = 1;

	if(semctl(sem_id,0,SETVAL,sem_val) == -1)
	{
		printf("semctl is error\n");
		return -1;
	}
    
	for(i=0; i<5; i++)
	{
		sem_op.sem_num = 0;
		sem_op.sem_op = 1;  //semop根据这个值而设置
		sem_op.sem_flg = 0;
		semop(sem_id,&sem_op,1);
		v_al = semctl(sem_id,0,GETVAL,0);
		printf("num: %d, v_al: %d\n",i,v_al);
	}

    return 0;
}



-----------------------sem_test2.c------------------------
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <unistd.h>

union semun
{
	int val;
	struct semid_ds *buf;
	unsigned short *array;
	struct seminfo *__buf;
};

int get_sem_val(int sid, int semnum)
{
	return(semctl(sid,semnum,GETVAL,0));
}

int main(int argc, char *argv[])
{
	int sem_id;
	int pid;
	int i,v_al;
	struct sembuf sem_op;//信号量结构
	union semun sem_val; //信号量数值

	key_t sem_Key;

	//将指定文件,temp_sem.txt转换成我们所需要的key,该文件必须存在且可存取,名字和数字相同就会产生相同的key,数字必须大于0
	sem_Key = ftok("temp_sem.txt", 1);
	if(sem_Key == -1)
	{
		printf("ftok is error\n");
		return -1;
	}
	
	//建立信号量集,其中只有一个信号量,0开始,作为第一个信号量
	sem_id = semget(sem_Key,1,IPC_CREAT|0777);
	if(sem_id == -1)
	{
		printf("sem_id is error\n");
		return -1;
	}

	sem_val.val = 1;

	if(semctl(sem_id,0,SETVAL,sem_val) == -1)
	{
		printf("semctl is error\n");
		return -1;
	}
    
	for(i=0; i<5; i++)
	{
		sem_op.sem_num = 0;
		sem_op.sem_op = -1;  //semop根据这个值而设置
		sem_op.sem_flg = 0;
		semop(sem_id,&sem_op,1);
		v_al = semctl(sem_id,0,GETVAL,0);
		printf("num: %d, v_al: %d\n",i,v_al);
	}

    return 0;
}

结果如下:

猜你喜欢

转载自blog.csdn.net/weixin_42432281/article/details/87883048