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: