【Linux信号通讯编程】信号量同步

来源:互联网 发布:面向对象数据库 编辑:程序博客网 时间:2024/05/16 11:41

一、进程同步

一组并发进程,他们之间需要一定的执行顺序,这时需要一个先执行,另一个等待执行。

这组并发的进程按照一定的顺序执行的过程称为进程间的同步。


二、经典的生产者与消费者问题


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命令搬移产品)


*


0 0
原创粉丝点击