Process communication under Linux: semaphore

Process communication : Data exchange between processes is called process communication. Process communication methods include: shared memory, semaphore, pipeline, message queue, socket, etc.

Semaphore: It can be regarded as a counter with atomic operations. It controls the access of multiple processes to shared resources. It usually describes the number of critical resources among critical resources. It is often used as a lock to prevent a A process accesses a resource that another process is using.

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

The result is as follows:

Guess you like

Origin blog.csdn.net/weixin_42432281/article/details/87883048