进程通信:进程与进程间的数据交换,称为进程通信。进程通讯的方式有:共享内存、信号量、管道、消息队列、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;
}
结果如下: