进程同步:一组并发进程进行互相合作、互相等待,使得各进程按一定的顺序执行的过程称为进程间的同步。如生产者与消费者问题,这是操作系统关于同步的一个经典问题。生产者生产产品,而消费者必须在生产者生产完毕后才能使用产品。
同步的关键是设置资源的信号量初始值为0,生产者执行完所有指令后释放该资源,即令其信号量变成1,使其能够被其它进程使用;消费者只获取信号量而不释放。
生产者进程A:创建信号量并设置初始值为0,然后生产,生产完毕后释放
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<sys/ipc.h>
#include<sys/sem.h>
void main()
{
int fd=open("/home/jx/myfile",O_RDWR|O_APPEND|O_CREAT,0777);
key_t key=ftok("/home/jx/myfile",1); /*创建键值*/
int semid=semget(key,1,IPC_CREAT); /*创建信号量集合,获取标示符*/
semctl(semid,0,SETVAL,0);/*设置信号量初始值*/
struct sembuf sop;
struct sembuf *sops=&sop;
write(fd,"hello ",6);
sleep(10);
write(fd,"world!",6);
close(fd);
/*释放信号量*/
sops->sem_num=0;
sops->sem_op=1;
sops->sem_flg=SEM_UNDO;
semop(semid,sops,1);
}
消费者进程B:获取信号量并使用资源
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/sem.h>
#include<stdlib.h>
void main()
{
key_t key=ftok("/home/jx/myfile",1); /*创建键值*/
int semid=semget(key,1,IPC_CREAT); /*创建信号量集合,获取标示符*/
/*获取信号量*/
struct sembuf sop;
struct sembuf *sops=&sop;
sops->sem_num=0;
sops->sem_op=-1;
sops->sem_flg=SEM_UNDO;
semop(semid,sops,1);
system("cp /home/jx/myfile /home/jx/myfile1");
}