一、进程同步
一组并发进程,他们之间需要一定的执行顺序,这时需要一个先执行,另一个等待执行。
这组并发的进程按照一定的顺序执行的过程称为进程间的同步。
二、经典的生产者与消费者问题
1、生产产品
product.c
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <sys/stat.h>
#include <fcntl.h>
void main()
{
int fd = 0;
key_t key = 0;
int semid = 0;
struct sembuf sops;
/* 创建并打开信号量集合. */
key = ftok("/home", 2);
semid = semget(key, 1, IPC_CREAT);
/* 设置信号量初始值,让消费者等待. */
semctl(semid, 0, SETVAL, 0);
/* ----------------------------------------------------- */
fd = open("./product.txt", O_RDWR | O_CREAT, 0755);
sleep(8);
write(fd, "I love ", 7);
sleep(8);
write(fd, "you. ", 5);
close(fd);
/* ----------------------------------------------------- */
/* 释放信号量. */
sops.sem_num = 0;
sops.sem_op = 1;
sops.sem_flg = SEM_UNDO;
semop(semid, &sops, 1);
}
2、复制产品:system("命令")
customer.c
#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/sem.h>
#include <sys/ipc.h>
void main()
{
key_t key = 0;
int semid = 0;
struct sembuf sops;
int ret;
key = ftok("/home", 2);
semid = semget(key, 1, IPC_CREAT);
/* 获取信号量. */
sops.sem_num = 0;
sops.sem_op = -1; //当生产者处于生产状态时, 消费者必须等到
sops.sem_flg = SEM_UNDO;
ret = semop(semid, &sops, 1);
if (ret < 0)
puts("Process error !");
system("cp ./product.txt ./dir"); //对产品的操作, 输入命令直接执行
}
* 执行结果:
* 生产者(product)执行完成后, 消费者(customer)来复制产品.(无论谁先运行, 最后customer都要等待product生产完成才能执行system命令搬移产品)
*